home *** CD-ROM | disk | FTP | other *** search
/ Amiga Tools 2 / Amiga Tools 2.iso / tex / macros / source / contrib / custom-bib / xbtxbst.mbs (.txt) < prev   
LaTeX Document  |  1995-03-09  |  95KB  |  2,760 lines

  1. %\iffalse
  2. %/////////////////////////////////////////
  3. %   Generic bibliography style           /
  4. %   Adapted from XBTXBST.DOC             /
  5. %   for use with or without MAKEBST.TEX  /
  6. %/////////////////////////////////////////
  7. % This file is self-documenting: simply LaTeX it!
  8. %% (Here are the specifications of the source file)
  9. %<*selfdoc>
  10. \ifx\undefined\endoptions\def\next{%
  11.    \NeedsTeXFormat{LaTeX2e}%
  12.    \documentclass[a4paper,11pt]{article}%
  13.    \usepackage{doc}%
  14.    \def\skipguard##1>{}\MakePercentIgnore\skipguard}\else\let\next\relax\fi
  15. \next
  16. %</selfdoc>
  17. %% \def\filename{xbtxbst.mbs}
  18. %% \def\filedate{1994 July 1}
  19. %% \def\fileversion{1.1}
  20. %\iffalse
  21. %% NOTICE:
  22. %% This file may be used for non-profit purposes.
  23. %% It may not be distributed in exchange for money, 
  24. %%   other than distribution costs.
  25. %%   
  26. %% The author provides it `as is' and does not guarantee it in any way.
  27. %% Copyright (C) 1993 Patrick W. Daly
  28. %% Max-Planck-Institut f\"ur Aeronomie
  29. %% Postfach 20
  30. %% D-37189 Katlenburg-Lindau
  31. %% Germany
  32. %% E-mail:
  33. %% SPAN--     nsp::linmpi::daly    (note nsp also known as ecd1)
  34. %% Internet-- daly@linmpi.dnet.gwdg.de   
  35. %%-----------------------------------------------------------
  36. %   For use with docstrip to select various style parameters
  37. %   This is derived from XBTXBST.DOC version 1.02 of Nelson H.F.Beebe
  38. %   which in turn is derived from Oren Patashnik's BTXBST.DOC.
  39. %   The original files are meant to be processed with a C Preprocessor.
  40. %   I have modified it to run under Frank Mittelbach's DOCSTRIP 
  41. %   program instead, with or without my MAKEBST interface. (MAKEBST
  42. %   uses information in this file to produce, with interactive menus,
  43. %   a DOCSTRIP batch job). I have also taken over Patashnik's (and Beebe's)
  44. %   comments and LaTeXized them so that this whole thing can produce a
  45. %   doc.sty type description. Just LaTeX this file to get it (you will
  46. %   need doc.sty, however).
  47. %                                              PWD
  48. %% \CharacterTable
  49. %%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
  50. %%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
  51. %%   Digits        \0\1\2\3\4\5\6\7\8\9
  52. %%   Exclamation   \!     Double quote  \"     Hash (number) \#
  53. %%   Dollar        \$     Percent       \%     Ampersand     \&
  54. %%   Acute accent  \'     Left paren    \(     Right paren   \)
  55. %%   Asterisk      \*     Plus          \+     Comma         \,
  56. %%   Minus         \-     Point         \.     Solidus       \/
  57. %%   Colon         \:     Semicolon     \;     Less than     \<
  58. %%   Equals        \=     Greater than  \>     Question mark \?
  59. %%   Commercial at \@     Left bracket  \[     Backslash     \\
  60. %%   Right bracket \]     Circumflex    \^     Underscore    \_
  61. %%   Grave accent  \`     Left brace    \{     Vertical bar  \|
  62. %%   Right brace   \}     Tilde         \~}
  63. % \CodelineIndex
  64. % ^^A\OnlyDescription
  65. % \setcounter{StandardModuleDepth}{1}
  66. % \begin{document}
  67. % \setcounter{IndexColumns}{2}
  68. % \setlength{\IndexMin}{10cm}
  69. % \changes{1.0}{1993 Aug 16}{Initial version}
  70. % \changes{1.1}{1994 July 1}{Change documentation to \LaTeX2e}
  71. % \changes{1.1}{1994 July 1}{Add possibility of NFSS commands}
  72. % ^^A Change margins to center text
  73. % \setlength{\oddsidemargin}{0.5\paperwidth}
  74. % \addtolength{\oddsidemargin}{-0.5\textwidth}
  75. % \addtolength{\oddsidemargin}{-1in}
  76. % \setlength{\evensidemargin}{\oddsidemargin}
  77. % \pagestyle{headings}
  78. % \title{\bfseries Docstrip Version of XBTXBST.DOC}
  79. %    
  80. % \author{P. W. Daly}
  81. % \date{This paper describes file \texttt{\filename},\\
  82. %  version \fileversion{} from \filedate}
  83. % \maketitle
  84. % \MakeShortVerb{\|}
  85. % \parskip=1ex \parindent=0pt
  86. % \newcommand{\btx}{\textsc{Bib}\TeX}
  87. % \newcommand{\dtx}{\textsf{docstrip}}
  88. % \part{About This File}
  89. % \section{Introduction}
  90. % When I got the idea of using Frank Mittelbach's \dtx{} program to
  91. % make up generic, or master, bibliographic style files for \btx, I took
  92. % the standard {\tt.bst} file {\tt plain} plus {\tt apalike} (also from
  93. % Patashnik) and merged them as my model. I wanted to add various options
  94. % using \dtx{} alternative coding, as explained in the next
  95. % sections. However, in order to find out what bibliographic features were
  96. % being used by others, I copied every {\tt.bst} file I could find in order
  97. % to compare the results. In this way I discovered {\tt xbtxbst.doc}, a
  98. % modified version of {\tt btxbst.doc} that includes ISBN and ISSN
  99. % numbers, as well as a |periodical| type. The {\tt.bst} styles produced
  100. % from it are normally prefixed with |is-| to distinguish them from the 
  101. % original four.
  102. % The original file {\tt btxbst.doc} is
  103. % Patashnik's master file for producing the four standard {\tt.bst} files,
  104. % and it works exactly as I visualized using \dtx{}, but with a
  105. % C-pre\-pro\-cessor. It contains only 6 options. It was no great problem
  106. % to convert the preprocessor commands to \dtx{} equivalents.
  107. % However, what is even more interesting is the extensive comments from
  108. % Patashnik that fill the coding. These are simply {\sc ascii} comments,
  109. % but I decided to try to convert them to \LaTeX{} format in order to
  110. % produce a true internally documented file in the manner of Mittelbach's
  111. % {\tt doc.sty} system. For anyone struggling through \btx{} formatting
  112. % language, this will be a great relief.
  113. % I provide this file in such a manner that when it is \LaTeX{}ed, it only
  114. % produces my introductory text, describing master files and {\tt makebst},
  115. % as well as the menus for running {\tt makebst} and \dtx{}. To
  116. % obtain the whole \btx{} coding, with Patashnik's comments, you must
  117. % remove the line |% \OnlyDescription| near the beginning. Removal is done
  118. % not by adding a \% sign (they have been turned off!) but by physical
  119. % deletion, or better, by adding |^^A|, as |% ^^A\OnlyDescription|. This is 
  120. % a speciality of {\tt doc.sty}, and not of normal \LaTeX.
  121. % \section{About Master Bibliographic Style Files}
  122. % \subsection{The \dtx{} Options}
  123. % This master file is a \btx{} bibliographic style file containing
  124. % alternative coding depending on \dtx{} options. The options are
  125. % selected when \dtx{} is run, either interactively or through a
  126. % batch job. 
  127. % Suppose that one of the options is called {\tt xyz}. Then the following
  128. % alternatives are possible:
  129. % \begin{quote}
  130. % |%<xyz> | \em one line of coding
  131. % \end{quote}
  132. % \emph{includes} the single line of coding;
  133. % \begin{quote}
  134. % |%<!xyz> | \em one line of coding 
  135. % \end{quote}
  136. % \emph{excludes} the single line;
  137. % \begin{quote}
  138. % |%<*xyz> | \\
  139. % \emph{several lines of coding}\\
  140. % |%</xyz> | 
  141. % \end{quote}
  142. % \emph{includes} all the bracketted lines;
  143. % \begin{quote}
  144. % |%<*!xyz> | \\
  145. % \emph{several lines of coding}\\
  146. % |%</!xyz> | 
  147. % \end{quote}
  148. % \emph{excludes} all the bracketted lines.
  149. % Options may be logically combined: the symbol \verb!|! is a logical {\sf
  150. % or}, |&| a logical {\sf and}, |!| a logical {\sf not}; parentheses {\tt(}
  151. % and {\tt)} may be used to group options.
  152. % \subsection{The \dtx{} Batch Job}
  153. % In order to generate a true \btx{} style file with selected options from
  154. % this master file, it is necessary to run a \dtx{} batch job.
  155. % Suppose that the master file is named {\tt master.mbs}, and the
  156. % resulting \btx{} style file is to be {\tt silly.bst}, and the batch job
  157. % file itself is called {\tt silly.drv}. To produce this with options, say,
  158. % {\tt xyz} and {\tt abc}, the batch job would look something like:
  159. % \begin{quote}\begin{verbatim}
  160. % \def\batchfile{silly.drv}
  161. % \input docstrip
  162. % \preamble
  163. % This is for Journal of Silly Results
  164. % \endpreamble
  165. % \postamble
  166. % End of customized bst file
  167. % \endpostamble
  168. % \keepsilent
  169. % \generateFile{silly.bst}{f}{\from{master.mbs}{xyz,abc}}
  170. % \end{verbatim}
  171. % \end{quote}
  172. % A preamble is not necessary, although it is advisable to include some
  173. % statement about the application of the bibliographic style. A postamble
  174. % \emph{is} vital, otherwise the default will add |\endinput| at the end
  175. % of the file, something that \btx{} will not understand. The |\keepsilent|
  176. % is optional and just suppresses \dtx{} output during processing.
  177. % \subsection{The {\tt makebst} Program}
  178. % The program {\tt makebst} simplifies the creation of the batch job file. To
  179. % do that, it needs information on the available options. This information
  180. % must be stored in a special format, either in the master file itself, or
  181. % in a file with the same root name but extension {\tt.opt}. The form of
  182. % this format is described in the documentation on {\tt makebst}.
  183. % In the master file, this information must be enclosed within \dtx{}
  184. % options |%<*options>| \dots |%</options>| and \emph{must} include an
  185. % |\endoptions| command. It may also include any number of comments. 
  186. % A sample menu in the master file to select one or none of options {\tt
  187. % xyz} \emph{or} {\tt zyx} would look thus:
  188. % \begin{quote}\begin{verbatim}
  189. % %<*options>
  190. % \mes{Select one of these}
  191. % \optdef{f}{xyz}{Option forword}{to do forward stuff}
  192. % \optdef{r}{zyx}{Option reverse}{to do reverse stuff}
  193. % \optdef{*}{}{None of the above}{}
  194. % \getans
  195. % \endoptions
  196. % %</options>
  197. % %<*!options>
  198. % . . . . . . 
  199. % %</!options>
  200. % \end{verbatim}
  201. % \end{quote}
  202. % An explanation of these commands is to be found in the documentation on 
  203. % {\tt makebst}.
  204. % The menu information may be extracted from the master file by means of
  205. % \dtx{} and stored in a file with extension {\tt.opt}. If this
  206. % file is missing, the program tries to read it from the master file.
  207. % \section{The Options}
  208. % The original file {\tt xbtxbst.doc} contains only 6 options for the
  209. % C-pre\-pro\-cessor, which I have easily changed to 6 corresponding 
  210. % \dtx{} options. (By comparison, my own master bibliographic style file
  211. % offers about 30.) 
  212. % These six options are:
  213. % \renewcommand{\descriptionlabel}[1]{\hspace\labelsep \tt #1}
  214. % \begin{description}
  215. % \item[lab-alph] an alphabetic label is produced instead of a running
  216. %    number;
  217. %    
  218. % \item[sorted] the references are listed alphabetically by author(s); if
  219. %    this is option is not given, then they appear in the list in the same
  220. %    order as they are cited in the text;
  221. %    
  222. % \item[name-full] first names of authors and editors are written out
  223. %    (provided they have been given in the entry); if this option is
  224. %    missing, then the first names are initialized;
  225. % \item[atit-lower] words in the titles of non-books (i.e., articles) are
  226. %    converted to lowercase, other than the first word, and any words enclosed
  227. %    in braces; if not given, such titles are reproduced as they are in the
  228. %    entry;
  229. %    
  230. % \item[month-full] the names of months are written out in full; otherwise
  231. %    they are abbreviated;
  232. %    
  233. % \item[jour-full] the names of the pre-defined journals are written out in
  234. %    full; otherwise they are abbreviated.
  235. % \end{description}
  236. % The following table shows the values of these options for the four
  237. % standard bibliographic styles (+ means active, $-$ means not active):
  238. % \DeleteShortVerb{\|}
  239. % \begin{center}
  240. % \begin{tabular}{c|cccc}
  241. % \emph{Option} & \tt plain & \tt unsrt & \tt abbrv & \tt alph \\ \hline
  242. % \tt lab-alph &     $-$   &     $-$   &     $-$   &    +      \\
  243. % \tt sorted   &      +    &     $-$   &      +    &    +      \\
  244. % \tt name-full&      +    &      +    &     $-$   &    +      \\
  245. % \tt atit-lower&     +    &      +    &      +    &    +      \\
  246. % \tt month-full&     +    &      +    &     $-$   &    +      \\
  247. % \tt jour-full&      +    &      +    &     $-$   &    +      \\ \hline
  248. % \end{tabular}\end{center}
  249. % \MakeShortVerb{\|}
  250. % To this I have now added a seventh option:
  251. % \begin{description}
  252. % \item[nfss] to use NFSS font commands instead of the older \LaTeX~2.09 ones.
  253. % \end{description}
  254. % This means that |\emph{text}| is used in place of |{\em text}|. Such a
  255. % {\tt.bst} file can only be used with \LaTeXe. This allows an easy way to
  256. % update the standard four {\tt.bst} files to the new \LaTeX.
  257. % \section{The Menu Information}
  258. % Here I describe the options and menu information for this particular
  259. % master file for use with {\tt makebst}.
  260. % All this menu information is nested between \dtx{} guard options
  261. % |%<*options>| \dots\ |%</options>|, and the last command is
  262. % |\endoptions|. The rest of the file is nested between |%<*!options>|
  263. % \dots\ |%</!options>| in order to exclude it if \dtx{} is used to
  264. % extract only the menu information.
  265. % First the menu identifies itself.
  266. %    \begin{macrocode}
  267. %<*options>
  268. \mes{^^JThis is XBTXBST.DOC, hacked to work with DOCSTRIP instead}
  269. \mes{\space\space of with a C Preprocessor}
  270. \mes{\space\space It is the Master File for the (extended) standard BibTeX}
  271. \mes{\space\space styles plain, unsrt, abbrv, and alpha}
  272. \mes{\space\space (Extended means ISBN and ISSN are included as fields)}
  273. %    \end{macrocode}
  274. % Now the inquisition begins. Note that the default answers produce the
  275. % {\tt plain} (more properly the {\tt is-plain}) bibliographic style.
  276. % This illustrates how the menu defaults may be different from the 
  277. % \dtx{} ones. The |^^J| forces a new line within the output message.
  278. %    \begin{macrocode}
  279. \mes{^^JSelect your options:^^JStyle of label:}
  280. \optdef{*}{}{Numerical}{for plain, unsrt, abbrv}
  281. \optdef{a}{lab-alph}{Alphabetical}{for alpha}
  282. \getans
  283. \mes{^^JOrdering:}
  284. \optdef{*}{sorted}{Sorted}{for plain, abbrv, alpha}
  285. \optdef{u}{}{Unsorted}{for unsrt}
  286. \getans
  287. \mes{^^JAuthor names:}
  288. \optdef{*}{name-full}{Names fully written}{for plain, unsrt, alpha}
  289. \optdef{a}{}{Names abbreviated}{for abbrv}
  290. \getans
  291. \mes{^^JNon-book titles:}
  292. \optdef{*}{atit-lower}{Converted to l.c.}{for plain, unsrt, abbrv, alpha}
  293. \optdef{u}{}{As in entry}{for none}
  294. \getans
  295. \mes{^^JMonth names:}
  296. \optdef{*}{month-full}{Full}{for plain, unsrt, alpha}
  297. \optdef{a}{}{Abbreviated}{for abbrv}
  298. \getans
  299. \mes{^^JJournal names:}
  300. \optdef{*}{jour-full}{Full}{for plain, unsrt, alpha}
  301. \optdef{a}{}{Abbreviated}{for abbrv}
  302. \getans
  303. \mes{^^JNEW FONT SELECTION SCHEME:}
  304. \optdef{*}{}{No NFSS}{use 2.09 font commands}
  305. \optdef{n}{nfss}{NFSS}{use \string\textbf, \string\emph, not \string\bf,
  306.                        \string\em}
  307. \getans
  308. \endoptions
  309. %</options>
  310. %    \end{macrocode}
  311. % \StopEventually{\relax
  312. %    \DeleteShortVerb{\|}
  313. %    \end{document}}
  314. % \newpage
  315. % \part{The Bibliographic Coding}
  316. % \begin{sl}
  317. % The remaining text is that found in {\tt xbtxbst.doc}, which is 
  318. % almost the same as that in {\tt btxbst.doc}. I have only modified
  319. % it to work as \LaTeX{} input, adding |\tt| where necessary, and changing
  320. % |"text"| to |``text''|, adding environments, and sectioning commands, 
  321. % and so on.
  322. % The original also contains several ``comment versions'' of the coding.
  323. % These are a simplified copy of the function in question. I have kept
  324. % them, as verbatim text. They are part of the comments themselves, and not
  325. % of the coding.
  326. % For more information about how the \btx{} stack language works, see
  327. % Patashnik's article {\tt btxhak.tex} that should be part of the standard
  328. % \LaTeX{} package.
  329. % The initial copyright and explanatory text has been moved from the
  330. % beginning to here; it is output into every {\tt.bst} file produced.
  331. % \end{sl}
  332. %    \begin{macrocode}
  333. %<*!options>
  334.  %% BibTeX `plain' family
  335.  %%       version 0.99b for BibTeX versions 0.99a or later, LaTeX version 2.09.
  336.  %%       Copyright (C) 1985, all rights reserved.
  337.  %%       Copying of this file is authorized only if either
  338.  %%       (1) you make absolutely no changes to your copy, including name, or
  339.  %%       (2) if you do make changes, you name it something other than
  340.  %%       btxbst.doc, plain.bst, unsrt.bst, alpha.bst, and abbrv.bst.
  341.  %%       This restriction helps ensure that all standard styles are identical.
  342.  %%       The file btxbst.doc has the documentation for this style.
  343. %    \end{macrocode}
  344. % \begin{sl}
  345. % From here on, it is Oren Patashnik's original text. Any other comments that
  346. % I may have will be entered in slanted typeface as here.
  347. % \hbox to \hsize{\hfill PWD}
  348. % \end{sl}
  349. % \section{Background}
  350. %   Entry formatting: Similar to that recommended by Mary-Claire van Leunen
  351. %       in ``A Handbook for Scholars''.  Book-like titles are italicized
  352. %       (emphasized) and non-book titles are converted to sentence
  353. %       capitalization (and not enclosed in quotes).
  354. %       This file outputs a |\newblock| between major blocks of an entry
  355. %       (the name |\newblock| is analogous to the names |\newline| and
  356. %          |\newpage|)
  357. %       so that the user can obtain an ``open'' format, which has a line break
  358. %       before each block and lines after the first are indented within blocks,
  359. %       by giving the optional |\documentstyle| argument |openbib|;
  360. %       the default is the ``closed'' format---blocks runs together.
  361. %   Citation alphabetic label format:
  362. % \begin{quote}
  363. %               |[Knu73]| for single author (or editor or key)\\
  364. %               |[AHU83]| (first letters of last names) for multiple authors
  365. % \end{quote}
  366. %   Citation label numberic format:
  367. % \begin{quote}
  368. %               |[number]|
  369. % \end{quote}
  370. %   Reference list ordering for sorted, alphabetic lables:
  371. % \begin{quote}
  372. %               alphabetical by citation label, then by author(s) or whatever
  373. %               passes for author in the absence of one, then by year,
  374. %               then title.
  375. % \end{quote}
  376. %   Reference list ordering for sorted, numeric lables:
  377. % \begin{quote}
  378. %            alphabetical by author(s) or whatever passes
  379. %            for author in the absence of one, then by year, then title.
  380. % \end{quote}
  381. %   Reference list ordering for unsorted:
  382. % \begin{quote}
  383. %               by the order cited in the text.
  384. % \end{quote}
  385. %   History:
  386. % \begin{list}{}{\labelwidth3cm \labelsep20pt \leftmargin\labelwidth
  387. %   \addtolength{\leftmargin}{\labelsep} \rightmargin0pt}
  388. % \item[12/16/84 (HWT)] Original {\tt plain} version, by Howard Trickey.
  389. % \item[12/23/84 (LL)] Some comments made by Leslie Lamport.
  390. % \item[2/16/85 (OP)] Changes based on LL's comments, Oren Patashnik.
  391. % \item[2/17/85 (HWT)] Template file and other standard styles made.
  392. % \item[3/28/85 (OP)] First release, version 0.98b for \btx{} 0.98f.
  393. % \item[5/09/85 (OP)] Version 0.98c for \btx{} 0.98i:
  394. %                       fixed Theoretical Computer Science macro name;
  395. %                       fixed the {\tt format.vol.num.pages} function.
  396. % \item[1/24/88 (OP)] Version 0.99a for \btx{} 0.99a, main changes:
  397. %                       assignment operator (|:=|) arguments reversed;
  398. %                       the |preamble$| function outputs the database 
  399. %                       |PREAMBLE|;
  400. %                       |entry.max$| and |global.max$| (built-in) variables 
  401. %                       replace
  402. %                       |entry.string.max| and |global.string.max|
  403. %                       functions;
  404. %                       alphabetizing by year then title, not just
  405. %                       title;
  406. %                       many unnecessary ties removed;
  407. %                       |\em| $\Rightarrow$ |\em|;
  408. %                       the {\tt alpha} style uses a superscripted `+' 
  409. %                       instead of a
  410. %                       `*' for unnamed names in constructing the
  411. %                       label;
  412. %                       the {\tt abbrv} style now uses ``Mar.''\ and
  413. %                       ``Sept.'';
  414. %                       the functions |calc.label| and |presort| now look 
  415. %                       at just
  416. %                       the fields they're supposed to;
  417. %                       |BOOKLET|, |MASTERSTHESIS|, |TECHREPORT| use nonbook 
  418. %                       titles;
  419. %                       |INBOOK| and |INCOLLECTION| take an optional type
  420. %                       (e.g.\
  421. %                       type = ``Section''), overriding the default
  422. %                       ``chapter'';
  423. %                       |BOOK|, |INBOOK|, |INCOLLECTION|, and
  424. %                       |PROCEEDINGS| now allow
  425. %                       either volume or number, not just volume;
  426. %                       |INCOLLECTION| now allows an edition and series field;
  427. %                        
  428. %                       |PROCEEDINGS| and |INPROCEEDINGS| now use the address 
  429. %                       field
  430. %                       to tell where a conference was held;
  431. %                       |INPROCEEDINGS| and |PROCEEDINGS| now allow either 
  432. %                       volume
  433. %                       or number, and also a series field;
  434. %                       |MASTERSTHESIS| and |PHDTHESIS| accept types other than
  435. %                       ``Master's thesis'' and ``PhD thesis'';
  436. %                       |UNPUBLISHED| now outputs, in one block, note then date;
  437. %                       
  438. %                       |MANUAL| now prints out the organization in
  439. %                       the first block if the author field is empty;
  440. %                       |MISC| can't be empty---it requires some optional field.
  441. % \item[3/23/88 (OP)] Version 0.99b for \btx{} 0.99c---changed the three
  442. %                       erroneous occurrences of {\tt cite} to |cite$|; this
  443. %                       change didn't affect the four standard styles, so the
  444. %                       0.99a versions of those styles are still current.
  445. % \end{list}
  446. % \section{Preliminaries}
  447. % \subsection{The {\tt ENTRY} declaration}
  448. %   Like Scribe's (according to pages 231-2 of the April '84 edition),
  449. %   but no {\tt fullauthor} or {\tt editors} fields because \btx{} does 
  450. %   name handling.
  451. %   The {\tt annote} field is commented out here because this family doesn't
  452. %   include an annotated bibliography style.  And in addition to the fields
  453. %   listed here, \btx{} has a built-in crossref field, explained later.
  454. %    \begin{macrocode}
  455. ENTRY
  456. %    \end{macrocode}
  457. % Fields:
  458. %    \begin{macrocode}
  459.   { address
  460. %    \end{macrocode}
  461. %           Usually the address of a publisher or other type of organization.
  462. %           Put information in this field only if it helps the reader find the
  463. %           thing---for example you should omit the address of a major
  464. %           publisher entirely.  For a |PROCEEDINGS| or an |INPROCEEDINGS|,
  465. %           however, it's the address of the conference; for those two entry
  466. %           types, include the publisher's or organization's address, if
  467. %           necessary, in the publisher or organization field.
  468. %    \begin{macrocode}
  469. %    annote
  470. %    \end{macrocode}
  471. %           Long annotation---for annotated bibliographies (begins sentence).
  472. %    \begin{macrocode}
  473.     author
  474. %    \end{macrocode}
  475. %           Name(s) of author(s), in \btx{} name format.
  476. %    \begin{macrocode}
  477.     booktitle
  478. %    \end{macrocode}
  479. %           Book title when the thing being referenced isn't the whole book.
  480. %           For book entries, the |title| field should be used instead.
  481. %    \begin{macrocode}
  482.     chapter
  483. %    \end{macrocode}
  484. %           Chapter (or section or whatever) number.
  485. %    \begin{macrocode}
  486.     edition
  487. %    \end{macrocode}
  488. %           Edition of a book---should be an ordinal (e.g., ``Second'').
  489. %    \begin{macrocode}
  490.     editor
  491. %    \end{macrocode}
  492. %           Name(s) of editor(s), in \btx{} name format.
  493. %           If there is also an |author| field, then the |editor| field 
  494. %           should be
  495. %           for the book or collection that the work appears in.
  496. %    \begin{macrocode}
  497.     howpublished
  498. %    \end{macrocode}
  499. %            How something strange has been published (begins sentence).
  500. %    \begin{macrocode}
  501.     institution
  502. %    \end{macrocode}
  503. %           Sponsoring institution of a technical report.
  504. %    \begin{macrocode}
  505.     isbn
  506. %    \end{macrocode}
  507. %           ISBN book number (a 10-digit number with optional
  508. %           embedded spaces or hyphens, where a `digit' is one of
  509. %           0123456789X).
  510. %    \begin{macrocode}
  511.     issn
  512. %    \end{macrocode}
  513. %           ISSN serial publication number (an 8-digit number with optional
  514. %           embedded spaces or hyphens, where a `digit' is one of
  515. %           0123456789X).
  516. %    \begin{macrocode}
  517.     journal
  518. %    \end{macrocode}
  519. %           Journal name (macros are provided for many).
  520. %    \begin{macrocode}
  521.     key
  522. %    \end{macrocode}
  523. %           Alphabetizing, labeling, and cross-referencing key
  524. %           (needed when an entry has no |author| or |editor|).
  525. %    \begin{macrocode}
  526.     month
  527. %    \end{macrocode}
  528. %           Month (macros are provided).
  529. %    \begin{macrocode}
  530.     note
  531. %    \end{macrocode}
  532. %           To help the reader find a reference (begins sentence).
  533. %    \begin{macrocode}
  534.     number
  535. %    \end{macrocode}
  536. %           Number of a journal or technical report, or of a work in a series.
  537. %    \begin{macrocode}
  538.     organization
  539. %    \end{macrocode}
  540. %           Organization sponsoring a conference (or publishing a manual); if
  541. %           the |editor| (or |author|) is empty, and if the organization 
  542. %           produces
  543. %           an awkward label or cross reference, you should put appropriately
  544. %           condensed organization information in the |key| field as well.
  545. %    \begin{macrocode}
  546.     pages
  547. %    \end{macrocode}
  548. %           Page number or numbers (use |--| to separate a range, use |+|
  549. %           to indicate pages following that don't form a simple range).
  550. %    \begin{macrocode}
  551.     publisher
  552. %    \end{macrocode}
  553. %           Publisher name.
  554. %    \begin{macrocode}
  555.     school
  556. %    \end{macrocode}
  557. %           School name (for theses).
  558. %    \begin{macrocode}
  559.     series
  560. %    \end{macrocode}
  561. %           The name of a series or set of books.
  562. %           An individual book will also have it's own title.
  563. %    \begin{macrocode}
  564.     title
  565. %    \end{macrocode}
  566. %           The title of the thing you're referring to.
  567. %    \begin{macrocode}
  568.     type
  569. %    \end{macrocode}
  570. %           Type of a Techreport (e.g., ``Research Note'') to be used instead of
  571. %           the default ``Technical Report''; or, similarly, the type of a
  572. %           thesis; or of a part of a book.
  573. %    \begin{macrocode}
  574.     volume
  575. %    \end{macrocode}
  576. %           The volume number of a journal or multivolume work.
  577. %    \begin{macrocode}
  578.     year
  579. %    \end{macrocode}
  580. %           The year should contain only numerals (technically, it should end
  581. %           with four numerals, after purification; doesn't a begin sentence).
  582. %    \begin{macrocode}
  583. %    \end{macrocode}
  584. % There are no integer entry variables
  585. %    \begin{macrocode}
  586. %    \end{macrocode}
  587. % These string entry variables are used to form the citation label.
  588. % In a storage pinch, |sort.label| can be easily computed on the fly.
  589. %    \begin{macrocode}
  590. %<*lab-alph>
  591. %<sorted>  { label extra.label sort.label }
  592. %    \end{macrocode}
  593. % It doesn't seem like a good idea to use an order-of-citation
  594. % reference list when using alphabetic labels, but when this happens
  595. % we do things a little differently
  596. %    \begin{macrocode}
  597. %<!sorted>  { label }
  598. %</lab-alph>
  599. %<!lab-alph>  { label }
  600. %    \end{macrocode}
  601. % \subsection{Description of the Processing}
  602. % Each entry function starts by calling |output.bibitem|, to write the
  603. % |\bibitem| and its arguments to the {\tt.bbl} file.  Then the various fields
  604. % are formatted and printed by |output| or |output.check|.  Those functions
  605. % handle the writing of separators (commas, periods, |\newblock|'s),
  606. % taking care not to do so when they are passed a null string.
  607. % Finally, |fin.entry| is called to add the final period and finish the
  608. % entry.
  609. % A bibliographic reference is formatted into a number of `blocks':
  610. % in the open format, a block begins on a new line and subsequent
  611. % lines of the block are indented.  A block may contain more than
  612. % one sentence (well, not a grammatical sentence, but something to
  613. % be ended with a sentence ending period).  The entry functions should
  614. % call |new.block| whenever a block other than the first is about to be
  615. % started.  They should call |new.sentence| whenever a new sentence is
  616. % to be started.  The output functions will ensure that if two
  617. % |new.sentence|'s occur without any non-null string being output between
  618. % them then there won't be two periods output.  Similarly for two
  619. % successive |new.block|'s.
  620. % The output routines don't write their argument immediately.
  621. % Instead, by convention, that argument is saved on the stack to be
  622. % output next time (when we'll know what separator needs to come
  623. % after it).  Meanwhile, the output routine has to pop the pending
  624. % output off the stack, append any needed separator, and write it.
  625. % \subsubsection{The Output States}
  626. % To tell which separator is needed, we maintain an |output.state|.
  627. % It will be one of these values:
  628. % \begin{description}
  629. % \item[before.all]              just after the |\bibitem|
  630. % \item[mid.sentence]            in the middle of a sentence: comma needed
  631. %                                       if more sentence is output
  632. % \item[after.sentence]          just after a sentence: period needed
  633. % \item[after.block]             just after a block (and sentence):
  634. %                                       period and |\newblock| needed.
  635. % \end{description}
  636. % Note: These styles don't use |after.sentence|.
  637. % \begin{quote}
  638. % VAR: |output.state| : INTEGER \qquad -- state variable for output
  639. % \end{quote}
  640. % \subsubsection{The Output Functions}
  641. % The |output.nonnull| function saves its argument (assumed to be nonnull)
  642. % on the stack, and writes the old saved value followed by any needed
  643. % separator.  The ordering of the tests is decreasing frequency of
  644. % occurrence.
  645. % \begin{verbatim}
  646. % output.nonnull(s) ==
  647. %  BEGIN
  648. %       s := argument on stack
  649. %       if output.state = mid.sentence then
  650. %           write$(pop() * ", ")
  651. %                 -- "pop" isn't a function: just use stack top
  652. %       else
  653. %           if output.state = after.block then
  654. %               write$(add.period$(pop()))
  655. %               newline$
  656. %               write$("\newblock ")
  657. %           else
  658. %               if output.state = before.all then
  659. %                   write$(pop())
  660. %               else        -- output.state should be after.sentence
  661. %                   write$(add.period$(pop()) * " ")
  662. %               fi
  663. %           fi
  664. %           output.state := mid.sentence
  665. %       fi
  666. %       push s on stack
  667. %  END
  668. % \end{verbatim}
  669. % The output function calls |output.nonnull| if its argument is non-empty;
  670. % its argument may be a missing field (thus, not necessarily a string)
  671. % \begin{verbatim}
  672. % output(s) ==
  673. %  BEGIN
  674. %       if not empty$(s) then output.nonnull(s)
  675. %       fi
  676. %  END
  677. % \end{verbatim}
  678. % The |output.check| function is the same as the |output| function except 
  679. % that, if
  680. % necessary, |output.check| warns the user that the |t| field shouldn't be 
  681. % empty
  682. % (this is because it probably won't be a good reference without the field;
  683. % the entry functions try to make the formatting look reasonable even when
  684. % such fields are empty).
  685. % \begin{verbatim}
  686. % output.check(s,t) ==
  687. %  BEGIN
  688. %       if empty$(s) then
  689. %           warning$("empty " * t * " in " * cite$)
  690. %       else output.nonnull(s)
  691. %       fi
  692. %  END
  693. % \end{verbatim}
  694. % The |output.bibitem| function writes the |\bibitem| for the current entry
  695. % (the label should already have been set up), and sets up the separator
  696. % state for the output functions.  And, it leaves a string on the stack
  697. % as per the output convention.
  698. % \begin{verbatim}
  699. % output.bibitem ==
  700. %  BEGIN
  701. %       newline$
  702. %       write$("\bibitem[")     % for alphabetic labels,
  703. %       write$(label)           % these three lines
  704. %       write$("]{")            % are used
  705. %       write$("\bibitem{")             % this line for numeric labels
  706. %       write$(cite$)
  707. %       write$("}")
  708. %       push "" on stack
  709. %       output.state := before.all
  710. %  END
  711. % \end{verbatim}
  712. % The |fin.entry| function finishes off an entry by adding a period to the
  713. % string remaining on the stack.  If the state is still |before.all|
  714. % then nothing was produced for this entry, so the result will look bad,
  715. % but the user deserves it. (We don't omit the whole entry because the
  716. % entry was cited, and a |\bibitem| is needed to define the citation label.)
  717. % \begin{verbatim}
  718. % fin.entry ==
  719. %  BEGIN
  720. %       write$(add.period$(pop()))
  721. %       newline$
  722. %  END
  723. % \end{verbatim}
  724. % The |new.block| function prepares for a new block to be output, and
  725. % |new.sentence| prepares for a new sentence.
  726. % \begin{verbatim}
  727. % new.block ==
  728. %  BEGIN
  729. %       if output.state <> before.all then
  730. %           output.state := after.block
  731. %       fi
  732. %  END
  733. % new.sentence ==
  734. %  BEGIN
  735. %       if output.state <> after.block then
  736. %           if output.state <> before.all then
  737. %               output.state :=  after.sentence
  738. %           fi
  739. %       fi
  740. %  END
  741. % \end{verbatim}
  742. % \subsection{Coding of Output Functions}
  743. %    \begin{macrocode}
  744. INTEGERS { output.state before.all mid.sentence after.sentence after.block }
  745. FUNCTION {init.state.consts}
  746. { #0 'before.all :=
  747.   #1 'mid.sentence :=
  748.   #2 'after.sentence :=
  749.   #3 'after.block :=
  750. %    \end{macrocode}
  751. % The variables |s| and |t| are temporary string holders.
  752. %    \begin{macrocode}
  753. STRINGS { s t }
  754. FUNCTION {output.nonnull}
  755. { 's :=
  756.   output.state mid.sentence =
  757.     { ", " * write$ }
  758.     { output.state after.block =
  759.         { add.period$ write$
  760.           newline$
  761.           "\newblock " write$
  762.         }
  763.         { output.state before.all =
  764.             'write$
  765.             { add.period$ " " * write$ }
  766.           if$
  767.         }
  768.       if$
  769.       mid.sentence 'output.state :=
  770.     }
  771.   if$
  772. FUNCTION {output}
  773. { duplicate$ empty$
  774.     'pop$
  775.     'output.nonnull
  776.   if$
  777. FUNCTION {output.check}
  778. { 't :=
  779.   duplicate$ empty$
  780.     { pop$ "empty " t * " in " * cite$ * warning$ }
  781.     'output.nonnull
  782.   if$
  783. FUNCTION {output.bibitem}
  784. { newline$
  785. %<*lab-alph>
  786.   "\bibitem[" write$
  787.   label write$
  788.   "]{" write$
  789. %</lab-alph>
  790. %<*!lab-alph>
  791.   "\bibitem{" write$
  792. %</!lab-alph>
  793.   cite$ write$
  794.   "}" write$
  795.   newline$
  796.   before.all 'output.state :=
  797. %    \end{macrocode}
  798. % This function finishes all entries.
  799. %    \begin{macrocode}
  800. FUNCTION {fin.entry}
  801. { add.period$
  802.   write$
  803.   newline$
  804. FUNCTION {new.block}
  805. { output.state before.all =
  806.     'skip$
  807.     { after.block 'output.state := }
  808.   if$
  809. FUNCTION {new.sentence}
  810. { output.state after.block =
  811.     'skip$
  812.     { output.state before.all =
  813.         'skip$
  814.         { after.sentence 'output.state := }
  815.       if$
  816.     }
  817.   if$
  818. %    \end{macrocode}
  819. % \subsection{Some Auxiliary Functions}
  820. % These three functions pop one or two (integer) arguments from the stack
  821. % and push a single one, either |0| or |1|.
  822. % The |skip$| in the |and| and |or| functions are used because
  823. % the corresponding |if$| would be idempotent.
  824. %    \begin{macrocode}
  825. FUNCTION {not}
  826. {   { #0 }
  827.     { #1 }
  828.   if$
  829. FUNCTION {and}
  830. {   'skip$
  831.     { pop$ #0 }
  832.   if$
  833. FUNCTION {or}
  834. {   { pop$ #1 }
  835.     'skip$
  836.   if$
  837. %    \end{macrocode}
  838. % Sometimes we begin a new block only if the block will be big enough.  The
  839. % |new.block.checka| function issues a |new.block| if its argument is nonempty;
  840. % |new.block.checkb| does the same if either of its \emph{two} arguments is 
  841. % nonempty.
  842. %    \begin{macrocode}
  843. FUNCTION {new.block.checka}
  844. { empty$
  845.     'skip$
  846.     'new.block
  847.   if$
  848. FUNCTION {new.block.checkb}
  849. { empty$
  850.   swap$ empty$
  851.   and
  852.     'skip$
  853.     'new.block
  854.   if$
  855. %    \end{macrocode}
  856. % The |new.sentence.check| functions are analogous.
  857. %    \begin{macrocode}
  858. FUNCTION {new.sentence.checka}
  859. { empty$
  860.     'skip$
  861.     'new.sentence
  862.   if$
  863. FUNCTION {new.sentence.checkb}
  864. { empty$
  865.   swap$ empty$
  866.   and
  867.     'skip$
  868.     'new.sentence
  869.   if$
  870. %    \end{macrocode}
  871. % \section{Formatting Functions}
  872. % \subsection{Formatting Names}
  873. % Here are some functions for formatting chunks of an entry.
  874. % By convention they either produce a string that can be followed by
  875. % a comma or period (using |add.period$|, so it is OK to end in a period),
  876. % or they produce the null string.
  877. % A useful utility is the |field.or.null| function, which checks if the
  878. % argument is the result of pushing a `missing' field (one for which no
  879. % assignment was made when the current entry was read in from the database)
  880. % or the result of pushing a string having no non-white-space characters.
  881. % It returns the null string if so, otherwise it returns the field string.
  882. % Its main (but not only) purpose is to guarantee that what's left on the
  883. % stack is a string rather than a missing field.
  884. % \begin{verbatim}
  885. % field.or.null(s) ==
  886. %  BEGIN
  887. %       if empty$(s) then return ""
  888. %       else return s
  889. %  END
  890. % \end{verbatim}
  891. % Another helper function is |emphasize|, which returns the argument emphasized,
  892. % if that is non-empty, otherwise it returns the null string.  Italic
  893. % corrections aren't used, so this function should be used when punctation
  894. % will follow the result.
  895. % \begin{verbatim}
  896. % emphasize(s) ==
  897. %  BEGIN
  898. %       if empty$(s) then return ""
  899. %       else return "{\em " * s * "}"
  900. % \end{verbatim}
  901. % The |format.names| function formats the argument (which should be in
  902. % \btx{} name format) into ``First Von Last, Junior'', separated by commas
  903. % and with an ``and'' before the last (but ending with ``et~al.'' if the last
  904. % of multiple authors is ``others'').  This function's argument should always
  905. % contain at least one name.
  906. % \begin{quote}
  907. % VAR: |nameptr, namesleft, numnames|: INTEGER\\
  908. % pseudoVAR: |nameresult|: STRING \qquad(it's what's accumulated on the stack)
  909. % \end{quote}
  910. % \begin{verbatim}
  911. % format.names(s) ==
  912. %  BEGIN
  913. %       nameptr := 1
  914. %       numnames := num.names$(s)
  915. %       namesleft := numnames
  916. %       while namesleft > 0
  917. %         do
  918. %                               % for full names:
  919. %           t := format.name$(s, nameptr, "{ff~}{vv~}{ll}{, jj}")
  920. %                               % for abbreviated first names:
  921. %           t := format.name$(s, nameptr, "{f.~}{vv~}{ll}{, jj}")
  922. %           if nameptr > 1 then
  923. %               if namesleft > 1 then nameresult := nameresult * ", " * t
  924. %               else if numnames > 2
  925. %                      then nameresult := nameresult * ","
  926. %                    fi
  927. %                    if t = "others"
  928. %                      then nameresult := nameresult * " et~al."
  929. %                      else nameresult := nameresult * " and " * t
  930. %                    fi
  931. %               fi
  932. %           else nameresult := t
  933. %           fi
  934. %           nameptr := nameptr + 1
  935. %           namesleft := namesleft - 1
  936. %         od
  937. %       return nameresult
  938. %  END
  939. % \end{verbatim}
  940. % The |format.authors| function returns the result of
  941. %  |format.names(author)|
  942. % if the |author| is present, or else it returns the null string.
  943. % \begin{verbatim}
  944. % format.authors ==
  945. %  BEGIN
  946. %       if empty$(author) then return ""
  947. %       else return format.names(author)
  948. %       fi
  949. %  END
  950. % \end{verbatim}
  951. % |Format.editors| is like |format.authors|, but it uses the |editor| field,
  952. % and appends ``, editor'' or ``, editors''.
  953. % \begin{verbatim}
  954. % format.editors ==
  955. %  BEGIN
  956. %       if empty$(editor) then return ""
  957. %       else
  958. %           if num.names$(editor) > 1 then
  959. %               return format.names(editor) * ", editors"
  960. %           else
  961. %               return format.names(editor) * ", editor"
  962. %           fi
  963. %       fi
  964. %  END
  965. % \end{verbatim}
  966. % Other formatting functions are similar, so no ``comment version'' will be
  967. % given for them.
  968. % \subsection{Coding the Names Format Functions}
  969. % The |pop$| in this function gets rid of the duplicate `empty' value and
  970. % the |skip$| returns the duplicate field value.
  971. %    \begin{macrocode}
  972. FUNCTION {field.or.null}
  973. { duplicate$ empty$
  974.     { pop$ "" }
  975.     'skip$
  976.   if$
  977. FUNCTION {emphasize}
  978. { duplicate$ empty$
  979.     { pop$ "" }
  980. %<!nfss>    { "{\em " swap$ * "}" * }
  981. %<nfss>    { "\emph{" swap$ * "}" * }
  982.   if$
  983. INTEGERS { nameptr namesleft numnames }
  984. FUNCTION {format.names}
  985. { 's :=
  986.   #1 'nameptr :=
  987.   s num.names$ 'numnames :=
  988.   numnames 'namesleft :=
  989.     { namesleft #0 > }
  990. %<name-full>    { s nameptr "{ff~}{vv~}{ll}{, jj}" format.name$ 't :=
  991. %<!name-full>    { s nameptr "{f.~}{vv~}{ll}{, jj}" format.name$ 't :=
  992.       nameptr #1 >
  993.         { namesleft #1 >
  994.             { ", " * t * }
  995.             { numnames #2 >
  996.                 { "," * }
  997.                 'skip$
  998.               if$
  999.               t "others" =
  1000.                 { " et~al." * }
  1001.                 { " and " * t * }
  1002.               if$
  1003.             }
  1004.           if$
  1005.         }
  1006.         't
  1007.       if$
  1008.       nameptr #1 + 'nameptr :=
  1009.       namesleft #1 - 'namesleft :=
  1010.     }
  1011.   while$
  1012. FUNCTION {format.authors}
  1013. { author empty$
  1014.     { "" }
  1015.     { author format.names }
  1016.   if$
  1017. FUNCTION {format.editors}
  1018. { editor empty$
  1019.     { "" }
  1020.     { editor format.names
  1021.       editor num.names$ #1 >
  1022.         { ", editors" * }
  1023.         { ", editor" * }
  1024.       if$
  1025.     }
  1026.   if$
  1027. FUNCTION {format.isbn}
  1028. { isbn empty$
  1029.     { "" }
  1030.     { new.block "ISBN " isbn * }
  1031.   if$
  1032. FUNCTION {format.issn}
  1033. { issn empty$
  1034.     { "" }
  1035.     { new.block "ISSN " issn * }
  1036.   if$
  1037. %    \end{macrocode}
  1038. % \subsection{Title and Date Format Functions}
  1039. % The |format.title| function is used for non-book-like titles.
  1040. % For most styles we convert to lowercase (except for the very first letter,
  1041. % and except for the first one after a colon (followed by whitespace)),
  1042. % and hope the user has brace-surrounded words that need to stay capitalized;
  1043. % for some styles, however, we leave it as it is in the database.
  1044. %    \begin{macrocode}
  1045. FUNCTION {format.title}
  1046. { title empty$
  1047.     { "" }
  1048. %<atit-lower>    { title "t" change.case$ }
  1049. %<!atit-lower>    'title
  1050.   if$
  1051. %    \end{macrocode}
  1052. % By default, \btx{} sets the global integer variable |global.max$| 
  1053. % to the \btx{}
  1054. % constant |glob_str_size|, the maximum length of a global string variable.
  1055. % Analogously, \btx{} sets the global integer variable |entry.max$| to
  1056. % |ent_str_size|, the maximum length of an entry string variable.
  1057. % The style designer may change these if necessary (but this is
  1058. % unlikely).
  1059. % The |n.dashify| function makes each single {\tt-} in a string a double
  1060. % {\tt--} if it's not already.
  1061. % \begin{quote}
  1062. % pseudoVAR: |pageresult|: STRING \qquad (it's what's accumulated on the stack)
  1063. % \end{quote}
  1064. % \begin{verbatim}
  1065. % n.dashify(s) ==
  1066. %  BEGIN
  1067. %       t := s
  1068. %       pageresult := ""
  1069. %       while (not empty$(t))
  1070. %         do
  1071. %           if (first character of t = "-")
  1072. %             then
  1073. %               if (next character isn't)
  1074. %                 then
  1075. %                   pageresult := pageresult * "--"
  1076. %                   t := t with the "-" removed
  1077. %                 else
  1078. %                   while (first character of t = "-")
  1079. %                     do
  1080. %                       pageresult := pageresult * "-"
  1081. %                       t := t with the "-" removed
  1082. %                     od
  1083. %               fi
  1084. %             else
  1085. %               pageresult := pageresult * the first character
  1086. %               t := t with the first character removed
  1087. %           fi
  1088. %         od
  1089. %       return pageresult
  1090. %  END
  1091. % \end{verbatim}
  1092. %    \begin{macrocode}
  1093. FUNCTION {n.dashify}
  1094. { 't :=
  1095.     { t empty$ not }
  1096.     { t #1 #1 substring$ "-" =
  1097.         { t #1 #2 substring$ "--" = not
  1098.             { "--" *
  1099.               t #2 global.max$ substring$ 't :=
  1100.             }
  1101.             {   { t #1 #1 substring$ "-" = }
  1102.                 { "-" *
  1103.                   t #2 global.max$ substring$ 't :=
  1104.                 }
  1105.               while$
  1106.             }
  1107.           if$
  1108.         }
  1109.         { t #1 #1 substring$ *
  1110.           t #2 global.max$ substring$ 't :=
  1111.         }
  1112.       if$
  1113.     }
  1114.   while$
  1115. %    \end{macrocode}
  1116. % The |format.date| function is for the month and year, but we give a warning if
  1117. % there's an empty year but the month is there, and we return the empty string
  1118. % if they're both empty.
  1119. %    \begin{macrocode}
  1120. FUNCTION {format.date}
  1121. { year empty$
  1122.     { month empty$
  1123.         { "" }
  1124.         { "there's a month but no year in " cite$ * warning$
  1125.           month
  1126.         }
  1127.       if$
  1128.     }
  1129.     { month empty$
  1130.         'year
  1131.         { month " " * year * }
  1132.       if$
  1133.     }
  1134.   if$
  1135. %    \end{macrocode}
  1136. % The |format.btitle| is for formatting the |title| field when it is a book-like
  1137. % entry---the style used here keeps it in uppers-and-lowers and emphasizes it.
  1138. %    \begin{macrocode}
  1139. FUNCTION {format.btitle}
  1140. { title emphasize
  1141. %    \end{macrocode}
  1142. % For several functions we'll need to connect two strings with a
  1143. % tie (|~|) if the second one isn't very long (fewer than 3 characters).
  1144. % The |tie.or.space.connect| function does that.  It concatenates the two
  1145. % strings on top of the stack, along with either a tie or space between
  1146. % them, and puts this concatenation back onto the stack:
  1147. % \begin{verbatim}
  1148. % tie.or.space.connect(str1,str2) ==
  1149. %    BEGIN
  1150. %       if text.length$(str2) < 3
  1151. %         then return the concatenation of str1, "~", and str2
  1152. %         else return the concatenation of str1, " ", and str2
  1153. %    END
  1154. % \end{verbatim}
  1155. %    \begin{macrocode}
  1156. FUNCTION {tie.or.space.connect}
  1157. { duplicate$ text.length$ #3 <
  1158.     { "~" }
  1159.     { " " }
  1160.   if$
  1161.   swap$ * *
  1162. %    \end{macrocode}
  1163. % The |either.or.check| function complains if both fields or an either-or pair
  1164. % are nonempty.
  1165. % \begin{verbatim}
  1166. % either.or.check(t,s) ==
  1167. %  BEGIN
  1168. %       if empty$(s) then
  1169. %           warning$(can't use both " * t * " fields in " * cite$)
  1170. %       fi
  1171. %  END
  1172. % \end{verbatim}
  1173. %    \begin{macrocode}
  1174. FUNCTION {either.or.check}
  1175. { empty$
  1176.     'pop$
  1177.     { "can't use both " swap$ * " fields in " * cite$ * warning$ }
  1178.   if$
  1179. %    \end{macrocode}
  1180. % The |format.bvolume| function is for formatting the volume and perhaps
  1181. % series name of a multivolume work.  If both a |volume| and a |series| field
  1182. % are there, we assume the |series| field is the title of the whole multivolume
  1183. % work (the |title| field should be the title of the thing being referred to),
  1184. % and we add an ``of \emph{series}''.  This function is called in mid-sentence.
  1185. %    \begin{macrocode}
  1186. FUNCTION {format.bvolume}
  1187. { volume empty$
  1188.     { "" }
  1189.     { "volume" volume tie.or.space.connect
  1190.       series empty$
  1191.         'skip$
  1192.         { " of " * series emphasize * }
  1193.       if$
  1194.       "volume and number" number either.or.check
  1195.     }
  1196.   if$
  1197. %    \end{macrocode}
  1198. % \subsection{Formats for Special Fields}
  1199. % The |format.number.series| function is for formatting the series name
  1200. % and perhaps number of a work in a series.  This function is similar to
  1201. % |format.bvolume|, although for this one the |series| must exist (and the
  1202. % |volume| must not exist).  If the |number| field is empty we output either
  1203. % the |series| field unchanged if it exists or else the null string.
  1204. % If both the |number| and |series| fields are there we assume the
  1205. % |series| field
  1206. % gives the name of the whole series (the |title| field should be the title
  1207. % of the work being one referred to), and we add an ``in \emph{series}''.
  1208. % We capitalize ``Number'' when this function is used at the beginning of 
  1209. % a block.
  1210. %    \begin{macrocode}
  1211. FUNCTION {format.number.series}
  1212. { volume empty$
  1213.     { number empty$
  1214.         { series field.or.null }
  1215.         { output.state mid.sentence =
  1216.             { "number" }
  1217.             { "Number" }
  1218.           if$
  1219.           number tie.or.space.connect
  1220.           series empty$
  1221.             { "there's a number but no series in " cite$ * warning$ }
  1222.             { " in " * series * }
  1223.           if$
  1224.         }
  1225.       if$
  1226.     }
  1227.     { "" }
  1228.   if$
  1229. %    \end{macrocode}
  1230. % The |format.edition| function appends ``edition'' to the edition, if present.
  1231. % We lowercase the edition (it should be something like ``Third''), because
  1232. % this doesn't start a sentence.
  1233. %    \begin{macrocode}
  1234. FUNCTION {format.edition}
  1235. { edition empty$
  1236.     { "" }
  1237.     { output.state mid.sentence =
  1238.         { edition "l" change.case$ " edition" * }
  1239.         { edition "t" change.case$ " edition" * }
  1240.       if$
  1241.     }
  1242.   if$
  1243. %    \end{macrocode}
  1244. % The |format.pages| function is used for formatting a page range in a book
  1245. % (and in rare circumstances, an article).
  1246. % The |multi.page.check| function examines the |pages| field for a 
  1247. % |-| or |,| or |+|
  1248. % so that |format.pages| can use ``page'' instead of ``pages'' if none exists.
  1249. % Note: |global.max$| here means ``take the rest of the string''.
  1250. % \begin{quote}
  1251. % VAR: |multiresult|: INTEGER \qquad (actually, a boolean)
  1252. % \end{quote}
  1253. % \begin{verbatim}
  1254. % multi.page.check(s) ==
  1255. %  BEGIN
  1256. %       t := s
  1257. %       multiresult := false
  1258. %       while ((not multiresult) and (not empty$(t)))
  1259. %         do
  1260. %           if (first character of t = "-" or "," or "+")
  1261. %             then multiresult := true
  1262. %             else t := t with the first character removed
  1263. %           fi
  1264. %         od
  1265. %       return multiresult
  1266. %  END
  1267. % \end{verbatim}
  1268. %    \begin{macrocode}
  1269. INTEGERS { multiresult }
  1270. FUNCTION {multi.page.check}
  1271. { 't :=
  1272.   #0 'multiresult :=
  1273.     { multiresult not
  1274.       t empty$ not
  1275.       and
  1276.     }
  1277.     { t #1 #1 substring$
  1278.       duplicate$ "-" =
  1279.       swap$ duplicate$ "," =
  1280.       swap$ "+" =
  1281.       or or
  1282.         { #1 'multiresult := }
  1283.         { t #2 global.max$ substring$ 't := }
  1284.       if$
  1285.     }
  1286.   while$
  1287.   multiresult
  1288. %    \end{macrocode}
  1289. % This function doesn't begin a sentence so ``pages'' isn't capitalized.
  1290. % Other functions that use this should keep that in mind.
  1291. %    \begin{macrocode}
  1292. FUNCTION {format.pages}
  1293. { pages empty$
  1294.     { "" }
  1295.     { pages multi.page.check
  1296.         { "pages" pages n.dashify tie.or.space.connect }
  1297.         { "page" pages tie.or.space.connect }
  1298.       if$
  1299.     }
  1300.   if$
  1301. %    \end{macrocode}
  1302. % The |format.vol.num.pages| function is for the volume, number, and page range
  1303. % of a journal article.  We use the format:  vol(number):pages, with some
  1304. % variations for empty fields.  This doesn't begin a sentence.
  1305. %    \begin{macrocode}
  1306. FUNCTION {format.vol.num.pages}
  1307. { volume field.or.null
  1308.   number empty$
  1309.     'skip$
  1310.     { "\penalty0 (" number * ")" * *
  1311.       volume empty$
  1312.         { "there's a number but no volume in " cite$ * warning$ }
  1313.         'skip$
  1314.       if$
  1315.     }
  1316.   if$
  1317.   pages empty$
  1318.     'skip$
  1319.     { duplicate$ empty$
  1320.         { pop$ format.pages }
  1321.         { ":\penalty0 " * pages n.dashify * }
  1322.       if$
  1323.     }
  1324.   if$
  1325. %    \end{macrocode}
  1326. % The |format.chapter.pages|, if the |chapter| is present, puts whatever 
  1327. % is in the
  1328. % |type| field (or else ``chapter'' if |type| is empty) in front of a 
  1329. % chapter number.
  1330. % It then appends the pages, if present.  This doesn't begin a sentence.
  1331. %    \begin{macrocode}
  1332. FUNCTION {format.chapter.pages}
  1333. { chapter empty$
  1334.     'format.pages
  1335.     { type empty$
  1336.         { "chapter" }
  1337.         { type "l" change.case$ }
  1338.       if$
  1339.       chapter tie.or.space.connect
  1340.       pages empty$
  1341.         'skip$
  1342.         { ", " * format.pages * }
  1343.       if$
  1344.     }
  1345.   if$
  1346. %    \end{macrocode}
  1347. % The |format.in.ed.booktitle| function is used for starting out a sentence
  1348. % that begins ``In \emph{booktitle}'', putting an editor before the 
  1349. % title if one exists.
  1350. %    \begin{macrocode}
  1351. FUNCTION {format.in.ed.booktitle}
  1352. { booktitle empty$
  1353.     { "" }
  1354.     { editor empty$
  1355.         { "In " booktitle emphasize * }
  1356.         { "In " format.editors * ", " * booktitle emphasize * }
  1357.       if$
  1358.     }
  1359.   if$
  1360. %    \end{macrocode}
  1361. % The function |empty.misc.check| complains if all six fields are empty, and
  1362. % if there's been no sorting or alphabetic-label complaint.
  1363. %    \begin{macrocode}
  1364. FUNCTION {empty.misc.check}
  1365. { author empty$ title empty$ howpublished empty$
  1366.   month empty$ year empty$ note empty$
  1367.   and and and and and
  1368. %<sorted>  key empty$ not and
  1369. %<!sorted&lab-alph>  key empty$ not and
  1370.     { "all relevant fields are empty in " cite$ * warning$ }
  1371.     'skip$
  1372.   if$
  1373. %    \end{macrocode}
  1374. % The function |format.thesis.type| returns either the (case-changed) 
  1375. % |type| field,
  1376. % if it is defined, or else the default string already on the stack
  1377. % (like ``Master's thesis'' or ``PhD thesis'').
  1378. %    \begin{macrocode}
  1379. FUNCTION {format.thesis.type}
  1380. { type empty$
  1381.     'skip$
  1382.     { pop$
  1383.       type "t" change.case$
  1384.     }
  1385.   if$
  1386. %    \end{macrocode}
  1387. % The function |format.tr.number| makes a string starting with
  1388. % ``Technical Report''
  1389. % (or |type|, if that field is defined), followed by the number if there is one;
  1390. % it returns the starting part (with a case change) even if there is no number.
  1391. % This is used at the beginning of a sentence.
  1392. %    \begin{macrocode}
  1393. FUNCTION {format.tr.number}
  1394. { type empty$
  1395.     { "Technical Report" }
  1396.     'type
  1397.   if$
  1398.   number empty$
  1399.     { "t" change.case$ }
  1400.     { number tie.or.space.connect }
  1401.   if$
  1402. %    \end{macrocode}
  1403. % \subsection{Cross-Reference Format Functions}
  1404. % Now come the cross-referencing functions (these are invoked because
  1405. % one entry in the database file(s) cross-references another, by giving
  1406. % the other entry's database key in a |crossref| field).  This feature
  1407. % allows one or more titled things that are part of a larger titled
  1408. % thing to cross-reference the larger thing.  These styles allow for
  1409. % five posibilities: 
  1410. % \begin{enumerate}
  1411. % \item an |ARTICLE| may cross-reference an |ARTICLE|;
  1412. % \item a |BOOK|, 
  1413. % \item |INBOOK|, or 
  1414. % \item |INCOLLECTION| may cross-reference a |BOOK|; or
  1415. % \item an |INPROCEEDINGS| may cross-reference a |PROCEEDINGS|.
  1416. % \end{enumerate}
  1417. % Each of these is explained in more detail later.
  1418. % An |ARTICLE| entry type may cross reference another |ARTICLE| (this is
  1419. % intended for when an entire journal is devoted to a single topic---but
  1420. % since there is no |JOURNAL| entry type, the journal, too, should be
  1421. % classified as an |ARTICLE| but without the |author| and |title| fields).
  1422. % This will result in two warning messages for the journal's entry
  1423. % if it's included in the reference list, but such is life.
  1424. % \begin{verbatim}
  1425. % format.article.crossref ==
  1426. %  BEGIN
  1427. %       if empty$(key) then
  1428. %           if empty$(journal) then
  1429. %               warning$("need key or journal for " * cite$ *
  1430. %                                               " to crossref " * crossref)
  1431. %               return(" \cite{" * crossref * "}")
  1432. %           else
  1433. %               return("In " * emphasize.correct (journal) *
  1434. %                                               " \cite{" * crossref * "}")
  1435. %               fi
  1436. %       else
  1437. %           return("In " * key * " \cite{" * crossref * "}")
  1438. %       fi
  1439. %  END
  1440. % \end{verbatim}
  1441. % The other cross-referencing functions are similar, so no ``comment
  1442. % version'' will be given for them.
  1443. %    \begin{macrocode}
  1444. FUNCTION {format.article.crossref}
  1445. { key empty$
  1446.     { journal empty$
  1447.         { "need key or journal for " cite$ * " to crossref " * crossref *
  1448.           warning$
  1449.           ""
  1450.         }
  1451. %<!nfss>        { "In {\em " journal * "\/}" * }
  1452. %<nfss>        { "In \emph{" journal * "}" * }
  1453.       if$
  1454.     }
  1455.     { "In " key * }
  1456.   if$
  1457.   " \cite{" * crossref * "}" *
  1458. %    \end{macrocode}
  1459. % We use just the last names of editors for a cross reference: either
  1460. % ``editor'', or ``editor1 and editor2'', or ``editor1 et~al.'' depending on
  1461. % whether there are one, or two, or more than two editors.
  1462. %    \begin{macrocode}
  1463. FUNCTION {format.crossref.editor}
  1464. { editor #1 "{vv~}{ll}" format.name$
  1465.   editor num.names$ duplicate$
  1466.   #2 >
  1467.     { pop$ " et~al." * }
  1468.     { #2 <
  1469.         'skip$
  1470.         { editor #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" =
  1471.             { " et~al." * }
  1472.             { " and " * editor #2 "{vv~}{ll}" format.name$ * }
  1473.           if$
  1474.         }
  1475.       if$
  1476.     }
  1477.   if$
  1478. %    \end{macrocode}
  1479. % A |BOOK| (or |INBOOK|) entry type (assumed to be for a single volume in a
  1480. % multivolume work) may cross reference another |BOOK| (the entire multivolume).
  1481. % Usually there will be an editor, in which case we use that to construct the
  1482. % cross reference; otherwise we use a nonempty |key| field or else the
  1483. % |series|
  1484. % field (since the series gives the title of the multivolume work).
  1485. %    \begin{macrocode}
  1486. FUNCTION {format.book.crossref}
  1487. { volume empty$
  1488.     { "empty volume in " cite$ * "'s crossref of " * crossref * warning$
  1489.       "In "
  1490.     }
  1491.     { "Volume" volume tie.or.space.connect
  1492.       " of " *
  1493.     }
  1494.   if$
  1495.   editor empty$
  1496.   editor field.or.null author field.or.null =
  1497.     { key empty$
  1498.         { series empty$
  1499.             { "need editor, key, or series for " cite$ * " to crossref " *
  1500.               crossref * warning$
  1501.               "" *
  1502.             }
  1503. %<!nfss>            { "{\em " * series * "\/}" * }
  1504. %<nfss>            { "\emph{" * series * "}" * }
  1505.           if$
  1506.         }
  1507.         { key * }
  1508.       if$
  1509.     }
  1510.     { format.crossref.editor * }
  1511.   if$
  1512.   " \cite{" * crossref * "}" *
  1513. %    \end{macrocode}
  1514. % An |INCOLLECTION| entry type may cross reference a |BOOK| (assumed to be the
  1515. % collection), or an |INPROCEEDINGS| may cross reference a |PROCEEDINGS|.
  1516. % Often there will be an editor, in which case we use that to construct
  1517. % the cross reference; otherwise we use a nonempty |key| field or else
  1518. % the |booktitle| field (which gives the cross-referenced work's title).
  1519. %    \begin{macrocode}
  1520. FUNCTION {format.incoll.inproc.crossref}
  1521. { editor empty$
  1522.   editor field.or.null author field.or.null =
  1523.     { key empty$
  1524.         { booktitle empty$
  1525.             { "need editor, key, or booktitle for " cite$ * " to crossref " *
  1526.               crossref * warning$
  1527.               ""
  1528.             }
  1529. %<!nfss>            { "In {\em " booktitle * "\/}" * }
  1530. %<nfss>            { "In \emph{" booktitle * "}" * }
  1531.           if$
  1532.         }
  1533.         { "In " key * }
  1534.       if$
  1535.     }
  1536.     { "In " format.crossref.editor * }
  1537.   if$
  1538.   " \cite{" * crossref * "}" *
  1539. %    \end{macrocode}
  1540. % \section{The Entry Type Functions}
  1541. % Now we define the type functions for all entry types that may appear
  1542. % in the {\tt.bib} file---e.g., functions like |article| and |book|.  These
  1543. % are the routines that actually generate the {\tt.bbl}-file output for
  1544. % the entry.  These must all precede the |READ| command.  In addition, the
  1545. % style designer should have a function |default.type| for unknown types.
  1546. % Note: The fields (within each list) are listed in order of appearance,
  1547. % except as described for an |inbook| or a |proceedings|.
  1548. % \subsection{The {\tt article} Function}
  1549. % The |article| function is for an article in a journal.  An article may
  1550. % |CROSSREF| another article.
  1551. % \begin{description}
  1552. % \item[] Required fields: |author|, |title|, |journal|, |year|
  1553. % \item[] Optional fields: |volume|, |number|, |pages|, |month|, |note|
  1554. % \end{description}
  1555. % \begin{verbatim}
  1556. % article ==
  1557. %  BEGIN
  1558. %       output.bibitem
  1559. %       output.check(format.authors,"author")
  1560. %       new.block
  1561. %       output.check(format.title,"title")
  1562. %       new.block
  1563. %       if missing$(crossref) then
  1564. %           output.check(emphasize(journal),"journal")
  1565. %           output(format.vol.num.pages)
  1566. %           output.check(format.date,"year")
  1567. %       else
  1568. %           output.nonnull(format.article.crossref)
  1569. %           output(format.pages)
  1570. %       fi
  1571. %       new.block
  1572. %       output(note)
  1573. %       fin.entry
  1574. %  END
  1575. % \end{verbatim}
  1576. % \subsection{The {\tt book} Function}
  1577. % The |book| function is for a whole book.  A book may |CROSSREF| another book.
  1578. % \begin{description}
  1579. % \item[] Required fields: |author| or |editor|, |title|, |publisher|, |year|
  1580. % \item[] Optional fields: |volume| or |number|, |series|, |address|, 
  1581. %          |edition|, |month|, |note|
  1582. % \end{description}
  1583. % \begin{verbatim}
  1584. % book ==
  1585. %  BEGIN
  1586. %       if empty$(author) then output.check(format.editors,"author and editor")
  1587. %       else    output.check(format.authors,"author")
  1588. %               if missing$(crossref) then
  1589. %                   either.or.check("author and editor",editor)
  1590. %               fi
  1591. %       fi
  1592. %       new.block
  1593. %       output.check(format.btitle,"title")
  1594. %       if missing$(crossref) then
  1595. %           output(format.bvolume)
  1596. %           new.block
  1597. %           output(format.number.series)
  1598. %           new.sentence
  1599. %           output.check(publisher,"publisher")
  1600. %           output(address)
  1601. %       else
  1602. %           new.block
  1603. %           output.nonnull(format.book.crossref)
  1604. %       fi
  1605. %       output(format.edition)
  1606. %       output.check(format.date,"year")
  1607. %       new.block
  1608. %       output(note)
  1609. %       fin.entry
  1610. %  END
  1611. % \end{verbatim}
  1612. % The other entry functions are all quite similar, so no ``comment
  1613. %  version'' will be given for them.
  1614. %    \begin{macrocode}
  1615. FUNCTION {article}
  1616. { output.bibitem
  1617.   format.authors "author" output.check
  1618.   new.block
  1619.   format.title "title" output.check
  1620.   new.block
  1621.   crossref missing$
  1622.     { journal emphasize "journal" output.check
  1623.       format.vol.num.pages output
  1624.       format.date "year" output.check
  1625.     }
  1626.     { format.article.crossref output.nonnull
  1627.       format.pages output
  1628.     }
  1629.   if$
  1630.   new.block
  1631.   note output
  1632.   fin.entry
  1633. FUNCTION {book}
  1634. { output.bibitem
  1635.   author empty$
  1636.     { format.editors "author and editor" output.check }
  1637.     { format.authors output.nonnull
  1638.       crossref missing$
  1639.         { "author and editor" editor either.or.check }
  1640.         'skip$
  1641.       if$
  1642.     }
  1643.   if$
  1644.   new.block
  1645.   format.btitle "title" output.check
  1646.   crossref missing$
  1647.     { format.bvolume output
  1648.       new.block
  1649.       format.number.series output
  1650.       new.sentence
  1651.       publisher "publisher" output.check
  1652.       address output
  1653.     }
  1654.     { new.block
  1655.       format.book.crossref output.nonnull
  1656.     }
  1657.   if$
  1658.   format.edition output
  1659.   format.date "year" output.check
  1660.   format.isbn output
  1661.   new.block
  1662.   note output
  1663.   fin.entry
  1664. %    \end{macrocode}
  1665. % \subsection{The {\tt booklet} Function}
  1666. % A booklet is a bound thing without a publisher or sponsoring institution.
  1667. % \begin{description}
  1668. % \item[] Required: |title|
  1669. % \item[] Optional: |author|, |howpublished|, |address|, |month|, |year|,
  1670. %         |note|
  1671. % \end{description}
  1672. %    \begin{macrocode}
  1673. FUNCTION {booklet}
  1674. { output.bibitem
  1675.   format.authors output
  1676.   new.block
  1677.   format.title "title" output.check
  1678.   howpublished address new.block.checkb
  1679.   howpublished output
  1680.   address output
  1681.   format.date output
  1682.   format.isbn output
  1683.   new.block
  1684.   note output
  1685.   fin.entry
  1686. %    \end{macrocode}
  1687. % \subsection{The {\tt inbook} Function}
  1688. % For the conference entry type, see inproceedings.
  1689. % An |inbook| is a piece of a book: either a chapter and/or a page range.
  1690. % It may |CROSSREF| a book.  If there's no |volume| field, the |type| field
  1691. % will come before number and series.
  1692. % \begin{description}
  1693. % \item[] Required: |author| or |editor|, |title|, |chapter| and/or
  1694. %         |pages|, |publisher|, |year|
  1695. % \item[] Optional: |volume| or |number|, |series|, |type|, |address|, 
  1696. % |edition|, |month|, |note|
  1697. % \end{description}
  1698. %    \begin{macrocode}
  1699. FUNCTION {inbook}
  1700. { output.bibitem
  1701.   author empty$
  1702.     { format.editors "author and editor" output.check }
  1703.     { format.authors output.nonnull
  1704.       crossref missing$
  1705.         { "author and editor" editor either.or.check }
  1706.         'skip$
  1707.       if$
  1708.     }
  1709.   if$
  1710.   new.block
  1711.   format.btitle "title" output.check
  1712.   crossref missing$
  1713.     { format.bvolume output
  1714.       format.chapter.pages "chapter and pages" output.check
  1715.       new.block
  1716.       format.number.series output
  1717.       new.sentence
  1718.       publisher "publisher" output.check
  1719.       address output
  1720.     }
  1721.     { format.chapter.pages "chapter and pages" output.check
  1722.       new.block
  1723.       format.book.crossref output.nonnull
  1724.     }
  1725.   if$
  1726.   format.edition output
  1727.   format.date "year" output.check
  1728.   format.isbn output
  1729.   new.block
  1730.   note output
  1731.   fin.entry
  1732. %    \end{macrocode}
  1733. % \subsection{The {\tt incollection} Function}
  1734. % An |incollection| is like |inbook|, but where there is a separate |title|
  1735. % for the referenced thing (and perhaps an |editor| for the whole).
  1736. % An |incollection| may |CROSSREF| a book.
  1737. % \begin{description}
  1738. % \item[] Required: |author|, |title|, |booktitle|, |publisher|, |year|
  1739. % \item[] Optional: |editor|, |volume| or |number|, |series|, |type|, 
  1740. %                   |chapter|, |pages|,
  1741. %                   |address|, |edition|, |month|, |note|
  1742. % \end{description}
  1743. %    \begin{macrocode}
  1744. FUNCTION {incollection}
  1745. { output.bibitem
  1746.   format.authors "author" output.check
  1747.   new.block
  1748.   format.title "title" output.check
  1749.   new.block
  1750.   crossref missing$
  1751.     { format.in.ed.booktitle "booktitle" output.check
  1752.       format.bvolume output
  1753.       format.number.series output
  1754.       format.chapter.pages output
  1755.       new.sentence
  1756.       publisher "publisher" output.check
  1757.       address output
  1758.       format.edition output
  1759.       format.date "year" output.check
  1760.     }
  1761.     { format.incoll.inproc.crossref output.nonnull
  1762.       format.chapter.pages output
  1763.     }
  1764.   if$
  1765.   format.isbn output
  1766.   new.block
  1767.   note output
  1768.   fin.entry
  1769. %    \end{macrocode}
  1770. % \subsection{The {\tt inproceedings} Function}
  1771. % An |inproceedings| is an article in a conference proceedings, and it may
  1772. % |CROSSREF| a proceedings.  If there's no |address| field, the month
  1773. % (and year) will appear just before note.
  1774. % \begin{description}
  1775. % \item[] Required: |author|, |title|, |booktitle|, |year|
  1776. % \item[] Optional: |editor|, |volume| or |number|, |series|, |pages|, 
  1777. %                   |address|, |month|,
  1778. %                   |organization|, |publisher|, |note|
  1779. % \end{description}
  1780. %    \begin{macrocode}
  1781. FUNCTION {inproceedings}
  1782. { output.bibitem
  1783.   format.authors "author" output.check
  1784.   new.block
  1785.   format.title "title" output.check
  1786.   new.block
  1787.   crossref missing$
  1788.     { format.in.ed.booktitle "booktitle" output.check
  1789.       format.bvolume output
  1790.       format.number.series output
  1791.       format.pages output
  1792.       address empty$
  1793.         { organization publisher new.sentence.checkb
  1794.           organization output
  1795.           publisher output
  1796.           format.date "year" output.check
  1797.         }
  1798.         { address output.nonnull
  1799.           format.date "year" output.check
  1800.           new.sentence
  1801.           organization output
  1802.           publisher output
  1803.         }
  1804.       if$
  1805.     }
  1806.     { format.incoll.inproc.crossref output.nonnull
  1807.       format.pages output
  1808.     }
  1809.   if$
  1810.   format.isbn output
  1811.   new.block
  1812.   note output
  1813.   fin.entry
  1814. %    \end{macrocode}
  1815. % The conference function is included for Scribe compatibility.
  1816. %    \begin{macrocode}
  1817. FUNCTION {conference} { inproceedings }
  1818. %    \end{macrocode}
  1819. % \subsection{The {\tt manual} Function}
  1820. % A manual is technical documentation.
  1821. % \begin{description}
  1822. % \item[] Required: |title|
  1823. % \item[] Optional: |author|, |organization|, |address|, |edition|,
  1824. %                   |month|, |year|, |note|
  1825. % \end{description}
  1826. %    \begin{macrocode}
  1827. FUNCTION {manual}
  1828. { output.bibitem
  1829.   author empty$
  1830.     { organization empty$
  1831.         'skip$
  1832.         { organization output.nonnull
  1833.           address output
  1834.         }
  1835.       if$
  1836.     }
  1837.     { format.authors output.nonnull }
  1838.   if$
  1839.   new.block
  1840.   format.btitle "title" output.check
  1841.   author empty$
  1842.     { organization empty$
  1843.         { address new.block.checka
  1844.           address output
  1845.         }
  1846.         'skip$
  1847.       if$
  1848.     }
  1849.     { organization address new.block.checkb
  1850.       organization output
  1851.       address output
  1852.     }
  1853.   if$
  1854.   format.edition output
  1855.   format.date output
  1856.   new.block
  1857.   note output
  1858.   fin.entry
  1859. %    \end{macrocode}
  1860. % \subsection{The {\tt mastersthesis} Function}
  1861. % A |mastersthesis| is a Master's thesis.
  1862. % \begin{description}
  1863. % \item[] Required: |author|, |title|, |school|, |year|
  1864. % \item[] Optional: |type|, |address|, |month|, |note|
  1865. % \end{description}
  1866. %    \begin{macrocode}
  1867. FUNCTION {mastersthesis}
  1868. { output.bibitem
  1869.   format.authors "author" output.check
  1870.   new.block
  1871.   format.title "title" output.check
  1872.   new.block
  1873.   "Master's thesis" format.thesis.type output.nonnull
  1874.   school "school" output.check
  1875.   address output
  1876.   format.date "year" output.check
  1877.   new.block
  1878.   note output
  1879.   fin.entry
  1880. %    \end{macrocode}
  1881. % \subsection{The {\tt misc} Function}
  1882. % A |misc| is something that doesn't fit elsewhere.
  1883. % \begin{description}
  1884. % \item[] Required: at least one of the `optional' fields
  1885. % \item[] Optional: |author|, |title|, |howpublished|, |month|, |year|,
  1886. %                   |note|
  1887. % \end{description}
  1888. %    \begin{macrocode}
  1889. FUNCTION {misc}
  1890. { output.bibitem
  1891.   format.authors output
  1892.   title howpublished new.block.checkb
  1893.   format.title output
  1894.   howpublished new.block.checka
  1895.   howpublished output
  1896.   format.date output
  1897.   format.issn output
  1898.   new.block
  1899.   note output
  1900.   fin.entry
  1901.   empty.misc.check
  1902. %    \end{macrocode}
  1903. % \subsection{The {\tt phdthesis} Function}
  1904. % A phdthesis is like a mastersthesis.
  1905. % \begin{description}
  1906. % \item[] Required: |author|, |title|, |school|, |year|
  1907. % \item[] Optional: |type|, |address|, |month|, |note|
  1908. % \end{description}
  1909. %    \begin{macrocode}
  1910. FUNCTION {phdthesis}
  1911. { output.bibitem
  1912.   format.authors "author" output.check
  1913.   new.block
  1914.   format.btitle "title" output.check
  1915.   new.block
  1916.   "PhD thesis" format.thesis.type output.nonnull
  1917.   school "school" output.check
  1918.   address output
  1919.   format.date "year" output.check
  1920.   new.block
  1921.   note output
  1922.   fin.entry
  1923. %    \end{macrocode}
  1924. % \subsection{The {\tt periodical} Function}
  1925. % {\sl (This is not part of the standard styles, but is an addition in
  1926. %   {\tt xbtxbst.doc}. ---PWD)}
  1927. % A periodical is a publication that appears at regular
  1928. % intervals.  This includes journals, magazines, and newspapers.
  1929. % If there is an |organization| but no |editor| field, the
  1930. % organization will appear as the first optional field (we try to
  1931. % make the first block nonempty); if there's no |address| field,
  1932. % the month (and year) will appear just before note.
  1933. % \begin{description}
  1934. % \item[] Required: |title|, |key|
  1935. % \item[] Optional: |editor|, |volume|, |number|, |series|, |address|,
  1936. %                   |month|, |year|,
  1937. %                   |organization|, |publisher|, |note|, |issn|,
  1938. %                   |howpublished|
  1939. % \end{description}
  1940. %    \begin{macrocode}
  1941. FUNCTION {periodical}
  1942. { output.bibitem
  1943.   editor empty$
  1944.     { organization output }
  1945.     { format.editors output.nonnull }
  1946.   if$
  1947.   new.block
  1948.   title emphasize "title" output.check
  1949. %  format.bvolume output
  1950. %  format.number.series output
  1951.   format.vol.num.pages output
  1952.   format.date output
  1953.   format.issn output
  1954.   new.sentence
  1955.   publisher output
  1956.   address output
  1957.   howpublished new.block.checka
  1958.   howpublished output
  1959.   new.block
  1960.   note output
  1961.   fin.entry
  1962. %    \end{macrocode}
  1963. % \subsection{The {\tt proceedings} Function}
  1964. % A proceedings is a conference proceedings.
  1965. % If there is an |organization| but no |editor| field, the organization will
  1966. % appear as the first optional field (we try to make the first block nonempty);
  1967. % if there's no |address| field, the month (and year) will appear just 
  1968. % before note.
  1969. % \begin{description}
  1970. % \item[] Required: |title|, |year|
  1971. % \item[] Optional: |editor|, |volume| or |number|, |series|, |address|,
  1972. %                   |month|,
  1973. %                   |organization|, |publisher|, |note|
  1974. % \end{description}
  1975. %    \begin{macrocode}
  1976. FUNCTION {proceedings}
  1977. { output.bibitem
  1978.   editor empty$
  1979.     { organization output }
  1980.     { format.editors output.nonnull }
  1981.   if$
  1982.   new.block
  1983.   format.btitle "title" output.check
  1984.   format.bvolume output
  1985.   format.number.series output
  1986.   address empty$
  1987.     { editor empty$
  1988.         { publisher new.sentence.checka }
  1989.         { organization publisher new.sentence.checkb
  1990.           organization output
  1991.         }
  1992.       if$
  1993.       publisher output
  1994.       format.date "year" output.check
  1995.     }
  1996.     { address output.nonnull
  1997.       format.date "year" output.check
  1998.       new.sentence
  1999.       editor empty$
  2000.         'skip$
  2001.         { organization output }
  2002.       if$
  2003.       publisher output
  2004.     }
  2005.   if$
  2006.   format.isbn output
  2007.   new.block
  2008.   note output
  2009.   fin.entry
  2010. %    \end{macrocode}
  2011. % \subsection{The {\tt techreport} Function}
  2012. % A |techreport| is a technical report.
  2013. % \begin{description}
  2014. % \item[] Required: |author|, |title|, |institution|, |year|
  2015. % \item[] Optional: |type|, |number|, |address|, |month|, |note|
  2016. % \end{description}
  2017. %    \begin{macrocode}
  2018. FUNCTION {techreport}
  2019. { output.bibitem
  2020.   format.authors "author" output.check
  2021.   new.block
  2022.   format.title "title" output.check
  2023.   new.block
  2024.   format.tr.number output.nonnull
  2025.   institution "institution" output.check
  2026.   address output
  2027.   format.date "year" output.check
  2028.   new.block
  2029.   note output
  2030.   fin.entry
  2031. %    \end{macrocode}
  2032. % \subsection{The {\tt unpublished} Function}
  2033. % An |unpublished| is something that hasn't been published.
  2034. % \begin{description}
  2035. % \item[] Required: |author|, |title|, |note|
  2036. % \item{} Optional: |month|, |year|
  2037. % \end{description}
  2038. %    \begin{macrocode}
  2039. FUNCTION {unpublished}
  2040. { output.bibitem
  2041.   format.authors "author" output.check
  2042.   new.block
  2043.   format.title "title" output.check
  2044.   new.block
  2045.   note "note" output.check
  2046.   format.date output
  2047.   fin.entry
  2048. %    \end{macrocode}
  2049. % \subsection{The {\tt default.type} Function}
  2050. % We use entry type |misc| for an unknown type; \btx{} gives a warning.
  2051. %    \begin{macrocode}
  2052. FUNCTION {default.type} { misc }
  2053. %    \end{macrocode}
  2054. % \section{Common Features}
  2055. % Here are macros for common things that may vary from style to style.
  2056. % Users are encouraged to use these macros.
  2057. % \subsection{The Months}
  2058. % Months are either written out in full or abbreviated
  2059. %    \begin{macrocode}
  2060. %<*month-full>
  2061. MACRO {jan} {"January"}
  2062. MACRO {feb} {"February"}
  2063. MACRO {mar} {"March"}
  2064. MACRO {apr} {"April"}
  2065. MACRO {may} {"May"}
  2066. MACRO {jun} {"June"}
  2067. MACRO {jul} {"July"}
  2068. MACRO {aug} {"August"}
  2069. MACRO {sep} {"September"}
  2070. MACRO {oct} {"October"}
  2071. MACRO {nov} {"November"}
  2072. MACRO {dec} {"December"}
  2073. %</month-full>
  2074. %<*!month-full>
  2075. MACRO {jan} {"Jan."}
  2076. MACRO {feb} {"Feb."}
  2077. MACRO {mar} {"Mar."}
  2078. MACRO {apr} {"Apr."}
  2079. MACRO {may} {"May"}
  2080. MACRO {jun} {"June"}
  2081. MACRO {jul} {"July"}
  2082. MACRO {aug} {"Aug."}
  2083. MACRO {sep} {"Sept."}
  2084. MACRO {oct} {"Oct."}
  2085. MACRO {nov} {"Nov."}
  2086. MACRO {dec} {"Dec."}
  2087. %</!month-full>
  2088. %    \end{macrocode}
  2089. % \subsection{Journal Names}
  2090. % Journals are either written out in full or abbreviated;
  2091. % the abbreviations are like those found in ACM publications.
  2092. % To get a completely different set of abbreviations, it may be best to make
  2093. % a separate {\tt.bib} file with nothing but those abbreviations; users 
  2094. % could then
  2095. % include that file name as the first argument to the |\bibliography|
  2096. % command.
  2097. %    \begin{macrocode}
  2098. %<*jour-full>
  2099. MACRO {acmcs} {"ACM Computing Surveys"}
  2100. MACRO {acta} {"Acta Informatica"}
  2101. MACRO {cacm} {"Communications of the ACM"}
  2102. MACRO {ibmjrd} {"IBM Journal of Research and Development"}
  2103. MACRO {ibmsj} {"IBM Systems Journal"}
  2104. MACRO {ieeese} {"IEEE Transactions on Software Engineering"}
  2105. MACRO {ieeetc} {"IEEE Transactions on Computers"}
  2106. MACRO {ieeetcad}
  2107.  {"IEEE Transactions on Computer-Aided Design of Integrated Circuits"}
  2108. MACRO {ipl} {"Information Processing Letters"}
  2109. MACRO {jacm} {"Journal of the ACM"}
  2110. MACRO {jcss} {"Journal of Computer and System Sciences"}
  2111. MACRO {scp} {"Science of Computer Programming"}
  2112. MACRO {sicomp} {"SIAM Journal on Computing"}
  2113. MACRO {tocs} {"ACM Transactions on Computer Systems"}
  2114. MACRO {tods} {"ACM Transactions on Database Systems"}
  2115. MACRO {tog} {"ACM Transactions on Graphics"}
  2116. MACRO {toms} {"ACM Transactions on Mathematical Software"}
  2117. MACRO {toois} {"ACM Transactions on Office Information Systems"}
  2118. MACRO {toplas} {"ACM Transactions on Programming Languages and Systems"}
  2119. MACRO {tcs} {"Theoretical Computer Science"}
  2120. %</jour-full>
  2121. %<*!jour-full>
  2122. MACRO {acmcs} {"ACM Comput. Surv."}
  2123. MACRO {acta} {"Acta Inf."}
  2124. MACRO {cacm} {"Commun. ACM"}
  2125. MACRO {ibmjrd} {"IBM J. Res. Dev."}
  2126. MACRO {ibmsj} {"IBM Syst.~J."}
  2127. MACRO {ieeese} {"IEEE Trans. Softw. Eng."}
  2128. MACRO {ieeetc} {"IEEE Trans. Comput."}
  2129. MACRO {ieeetcad}
  2130.  {"IEEE Trans. Comput.-Aided Design Integrated Circuits"}
  2131. MACRO {ipl} {"Inf. Process. Lett."}
  2132. MACRO {jacm} {"J.~ACM"}
  2133. MACRO {jcss} {"J.~Comput. Syst. Sci."}
  2134. MACRO {scp} {"Sci. Comput. Programming"}
  2135. MACRO {sicomp} {"SIAM J. Comput."}
  2136. MACRO {tocs} {"ACM Trans. Comput. Syst."}
  2137. MACRO {tods} {"ACM Trans. Database Syst."}
  2138. MACRO {tog} {"ACM Trans. Gr."}
  2139. MACRO {toms} {"ACM Trans. Math. Softw."}
  2140. MACRO {toois} {"ACM Trans. Office Inf. Syst."}
  2141. MACRO {toplas} {"ACM Trans. Prog. Lang. Syst."}
  2142. MACRO {tcs} {"Theoretical Comput. Sci."}
  2143. %</!jour-full>
  2144. %    \end{macrocode}
  2145. % \section{Processing}
  2146. % \subsection{Input the Entries}
  2147. % Now we read in the {\tt.bib} entries.
  2148. %    \begin{macrocode}
  2149. %    \end{macrocode}
  2150. %\subsection{Auxiliary Functions for Labels}
  2151. % The sortify function converts to lower case after |purify$|ing; it's
  2152. % used in sorting and in computing alphabetic labels after sorting.
  2153. % The |chop.word(w,len,s)| function returns either |s| or, if the first
  2154. % |len|
  2155. % letters of |s| equals |w| (this comparison is done in the third line of the
  2156. % function's definition), it returns that part of |s| after |w|.
  2157. %    \begin{macrocode}
  2158. %<*sorted>
  2159. FUNCTION {sortify}
  2160. { purify$
  2161.   "l" change.case$
  2162. INTEGERS { len }
  2163. FUNCTION {chop.word}
  2164. { 's :=
  2165.   'len :=
  2166.   s #1 len substring$ =
  2167.     { s len #1 + global.max$ substring$ }
  2168.     's
  2169.   if$
  2170. %</sorted>
  2171. %<*lab-alph&!sorted>
  2172. %    \end{macrocode}
  2173. % We need the |chop.word| stuff for the dubious 
  2174. % \emph{unsorted-list-with-labels} case.
  2175. %    \begin{macrocode}
  2176. INTEGERS { len }
  2177. FUNCTION {chop.word}
  2178. { 's :=
  2179.   'len :=
  2180.   s #1 len substring$ =
  2181.     { s len #1 + global.max$ substring$ }
  2182.     's
  2183.   if$
  2184. %</lab-alph&!sorted>
  2185. %    \end{macrocode}
  2186. % \subsection{Making Labels}
  2187. % This long comment applies only to alphabetic labels.
  2188. % The |format.lab.names| function makes a short label by using the initials of
  2189. % the von and Last parts of the names (but if there are more than four names,
  2190. % (i.e., people) it truncates after three and adds a superscripted |+|;
  2191. % it also adds such a |+| if the last of multiple authors is ``others'').
  2192. % If there is only one name, and its von and Last parts combined have just
  2193. % a single name-token (``Knuth'' has a single token, ``Brinch Hansen'' has two),
  2194. % we take the first three letters of the last name.  The boolean
  2195. % |et.al.char.used| tells whether we've used a superscripted |+|, so that we
  2196. % know whether to include a \LaTeX{} macro for it.
  2197. % \begin{verbatim}
  2198. % format.lab.names(s) ==
  2199. %  BEGIN
  2200. %       numnames := num.names$(s)
  2201. %       if numnames > 1 then
  2202. %           if numnames > 4 then
  2203. %               namesleft := 3
  2204. %           else
  2205. %               namesleft := numnames
  2206. %           nameptr := 1
  2207. %           nameresult := ""
  2208. %           while namesleft > 0
  2209. %             do
  2210. %               if (name_ptr = numnames) and
  2211. %                    format.name$(s, nameptr, "{ff }{vv }{ll}{ jj}") = "others"
  2212. %                  then nameresult := nameresult * "{\etalchar{+}}"
  2213. %                       et.al.char.used := true
  2214. %                  else nameresult := nameresult *
  2215. %                               format.name$(s, nameptr, "{v{}}{l{}}")
  2216. %               nameptr := nameptr + 1
  2217. %               namesleft := namesleft - 1
  2218. %             od
  2219. %           if numnames > 4 then
  2220. %               nameresult := nameresult * "{\etalchar{+}}"
  2221. %               et.al.char.used := true
  2222. %       else
  2223. %           t := format.name$(s, 1, "{v{}}{l{}}")
  2224. %           if text.length$(t) < 2 then % there's just one name-token
  2225. %               nameresult := text.prefix$(format.name$(s,1,"{ll}"),3)
  2226. %           else
  2227. %               nameresult := t
  2228. %           fi
  2229. %       fi
  2230. %       return nameresult
  2231. %  END
  2232. % \end{verbatim}
  2233. % Exactly what fields we look at in constructing the primary part of the label
  2234. % depends on the entry type; this selectivity (as opposed to, say, always
  2235. % looking at author, then editor, then key) helps ensure that ``ignored''
  2236. % fields,
  2237. % as described in the \LaTeX{} book, really are ignored.  Note that
  2238. % |MISC| is part
  2239. % of the deepest `else' clause in the nested part of |calc.label|; thus, any
  2240. % unrecognized entry type in the database is handled correctly.
  2241. % There is one auxiliary function for each of the four different sequences of
  2242. % fields we use.  The first of these functions looks at the |author| field, and
  2243. % then, if necessary, the |key| field.  The other three functions, which might
  2244. % look at two fields and the |key| field, are similar, except that the
  2245. % |key| field
  2246. % takes precedence over the |organization| field (for labels---not for sorting).
  2247. % The |calc.label| function calculates the preliminary label of an entry, which
  2248. % is formed by taking three letters of information from the |author| or 
  2249. % |editor| or
  2250. % |key| or |organization| field (depending on the entry type and on 
  2251. % what's empty,
  2252. % but ignoring a leading ``The '' in the organization), and appending the last
  2253. % two characters (digits) of the year. It is an error if the appropriate fields
  2254. % among |author|, |editor|, |organization|, and |key| are missing, and we use
  2255. % the first three letters of the |cite$| in desperation when this happens.
  2256. % The resulting label has the |year| part, but not the |name| part,
  2257. % |purify$|ed
  2258. % (|purify$|ing the year allows some sorting shenanigans by the user).
  2259. % This function also calculates the version of the label to be used in sorting.
  2260. % The final label may need a trailing `a', `b', etc., to distinguish it from
  2261. % otherwise identical labels, but we can't calculated those
  2262. % |extra.label|s
  2263. % until after sorting.
  2264. % \begin{verbatim}
  2265. % calc.label ==
  2266. %  BEGIN
  2267. %       if type$ = "book" or "inbook" then
  2268. %           author.editor.key.label
  2269. %       else if type$ = "proceedings" then
  2270. %           editor.key.organization.label
  2271. %       else if type$ = "manual" then
  2272. %           author.key.organization.label
  2273. %       else
  2274. %           author.key.label
  2275. %       fi fi fi
  2276. %       label := label * substring$(purify$(field.or.null(year)), -1, 2)
  2277. %               % assuming we will also sort, we calculate a sort.label
  2278. %       sort.label := sortify(label), but use the last four, not two, digits
  2279. %  END
  2280. % \end{verbatim}
  2281. %    \begin{macrocode}
  2282. %<*lab-alph>
  2283. INTEGERS { et.al.char.used }
  2284. FUNCTION {initialize.et.al.char.used}
  2285. { #0 'et.al.char.used :=
  2286. EXECUTE {initialize.et.al.char.used}
  2287. FUNCTION {format.lab.names}
  2288. { 's :=
  2289.   s num.names$ 'numnames :=
  2290.   numnames #1 >
  2291.     { numnames #4 >
  2292.         { #3 'namesleft := }
  2293.         { numnames 'namesleft := }
  2294.       if$
  2295.       #1 'nameptr :=
  2296.       ""
  2297.         { namesleft #0 > }
  2298.         { nameptr numnames =
  2299.             { s nameptr "{ff }{vv }{ll}{ jj}" format.name$ "others" =
  2300.                 { "{\etalchar{+}}" *
  2301.                   #1 'et.al.char.used :=
  2302.                 }
  2303.                 { s nameptr "{v{}}{l{}}" format.name$ * }
  2304.               if$
  2305.             }
  2306.             { s nameptr "{v{}}{l{}}" format.name$ * }
  2307.           if$
  2308.           nameptr #1 + 'nameptr :=
  2309.           namesleft #1 - 'namesleft :=
  2310.         }
  2311.       while$
  2312.       numnames #4 >
  2313.         { "{\etalchar{+}}" *
  2314.           #1 'et.al.char.used :=
  2315.         }
  2316.         'skip$
  2317.       if$
  2318.     }
  2319.     { s #1 "{v{}}{l{}}" format.name$
  2320.       duplicate$ text.length$ #2 <
  2321.         { pop$ s #1 "{ll}" format.name$ #3 text.prefix$ }
  2322.         'skip$
  2323.       if$
  2324.     }
  2325.   if$
  2326. FUNCTION {author.key.label}
  2327. { author empty$
  2328.     { key empty$
  2329. %<sorted>        { cite$ #1 #3 substring$ }
  2330. %<*!sorted>
  2331. %    \end{macrocode}
  2332. % We need a warning here because we won't give it later
  2333. %    \begin{macrocode}
  2334.         { "for label, need author or key in " cite$ * warning$
  2335.           cite$ #1 #3 substring$
  2336.         }
  2337. %</!sorted>
  2338.         { key #3 text.prefix$ }
  2339.       if$
  2340.     }
  2341.     { author format.lab.names }
  2342.   if$
  2343. FUNCTION {author.editor.key.label}
  2344. { author empty$
  2345.     { editor empty$
  2346.         { key empty$
  2347. %<sorted>            { cite$ #1 #3 substring$ }
  2348. %<*!sorted>
  2349.             { "for label, need author, editor, or key in " cite$ * warning$
  2350.               cite$ #1 #3 substring$
  2351.             }
  2352. %</!sorted>
  2353.             { key #3 text.prefix$ }
  2354.           if$
  2355.         }
  2356.         { editor format.lab.names }
  2357.       if$
  2358.     }
  2359.     { author format.lab.names }
  2360.   if$
  2361. FUNCTION {author.key.organization.label}
  2362. { author empty$
  2363.     { key empty$
  2364.         { organization empty$
  2365. %<sorted>            { cite$ #1 #3 substring$ }
  2366. %<*!sorted>
  2367.             { "for label, need author, key, or organization in " cite$ *
  2368.                                                                 warning$
  2369.               cite$ #1 #3 substring$
  2370.             }
  2371. %</!sorted>
  2372.             { "The " #4 organization chop.word #3 text.prefix$ }
  2373.           if$
  2374.         }
  2375.         { key #3 text.prefix$ }
  2376.       if$
  2377.     }
  2378.     { author format.lab.names }
  2379.   if$
  2380. FUNCTION {editor.key.organization.label}
  2381. { editor empty$
  2382.     { key empty$
  2383.         { organization empty$
  2384. %<sorted>            { cite$ #1 #3 substring$ }
  2385. %<*!sorted>
  2386.             { "for label, need editor, key, or organization in " cite$ *
  2387.                                                                 warning$
  2388.               cite$ #1 #3 substring$
  2389.             }
  2390. %</!sorted>
  2391.             { "The " #4 organization chop.word #3 text.prefix$ }
  2392.           if$
  2393.         }
  2394.         { key #3 text.prefix$ }
  2395.       if$
  2396.     }
  2397.     { editor format.lab.names }
  2398.   if$
  2399. FUNCTION {calc.label}
  2400. { type$ "book" =
  2401.   type$ "inbook" =
  2402.     'author.editor.key.label
  2403.     { type$ "proceedings" =
  2404.         'editor.key.organization.label
  2405.         { type$ "manual" =
  2406.             'author.key.organization.label
  2407.             'author.key.label
  2408.           if$
  2409.         }
  2410.       if$
  2411.     }
  2412.   if$
  2413.   duplicate$
  2414.   year field.or.null purify$ #-1 #2 substring$
  2415.   'label :=
  2416.   year field.or.null purify$ #-1 #4 substring$
  2417.   sortify 'sort.label :=
  2418. %    \end{macrocode}
  2419. % \subsection{Sorting}
  2420. % It doesn't seem like a particularly good idea to use an order-of-citation
  2421. % reference list when using alphabetic labels, but we need to have a
  2422. % special pass to calculate labels when this happens.
  2423. %    \begin{macrocode}
  2424. %<!sorted>ITERATE {calc.label}
  2425. %</lab-alph>
  2426. %    \end{macrocode}
  2427. % When sorting, we compute the sortkey by executing |presort| on each entry.
  2428. % The presort key contains a number of |sortify|ed strings, concatenated
  2429. % with multiple blanks between them.  This makes things like ``brinch
  2430. % per''
  2431. % come before ``brinch hansen  per''.
  2432. % The fields used here are: the |sort.label| for alphabetic labels (as set by
  2433. % |calc.label|), followed by the author names (or editor names or organization
  2434. % (with a leading ``The '' removed) or key field, depending on entry type and on
  2435. % what's empty), followed by year, followed by the first bit of the title
  2436. % (chopping off a leading ``The '', ``A '', or ``An '').
  2437. % Names are formatted: Von Last First Junior.
  2438. % The names within a part will be separated by a single blank
  2439. % (such as ``brinch hansen''), two will separate the name parts themselves
  2440. % (except the von and last), three will separate the names,
  2441. % four will separate the names from year (and from label, if alphabetic),
  2442. % and four will separate year from title.
  2443. % The |sort.format.names| function takes an argument that should be in
  2444. % \btx{} name format, and returns a string containing ``\verb*!   !''-separated
  2445. % names in the format described above.  The function is almost the same
  2446. % as |format.names|.
  2447. %    \begin{macrocode}
  2448. %<*sorted>
  2449. FUNCTION {sort.format.names}
  2450. { 's :=
  2451.   #1 'nameptr :=
  2452.   s num.names$ 'numnames :=
  2453.   numnames 'namesleft :=
  2454.     { namesleft #0 > }
  2455.     { nameptr #1 >
  2456.         { "   " * }
  2457.         'skip$
  2458.       if$
  2459. %<name-full>      s nameptr "{vv{ } }{ll{ }}{  ff{ }}{  jj{ }}" format.name$ 't :=
  2460. %<!name-full>      s nameptr "{vv{ } }{ll{ }}{  f{ }}{  jj{ }}" format.name$ 't :=
  2461.       nameptr numnames = t "others" = and
  2462.         { "et al" * }
  2463.         { t sortify * }
  2464.       if$
  2465.       nameptr #1 + 'nameptr :=
  2466.       namesleft #1 - 'namesleft :=
  2467.     }
  2468.   while$
  2469. %    \end{macrocode}
  2470. % The |sort.format.title| function returns the argument,
  2471. % but first any leading ``A ''\,'s, ``An ''\,'s, or ``The ''\,'s are removed.
  2472. % The |chop.word| function uses |s|, so we need another string variable,
  2473. % |t|.
  2474. %    \begin{macrocode}
  2475. FUNCTION {sort.format.title}
  2476. { 't :=
  2477.   "A " #2
  2478.     "An " #3
  2479.       "The " #4 t chop.word
  2480.     chop.word
  2481.   chop.word
  2482.   sortify
  2483.   #1 global.max$ substring$
  2484. %    \end{macrocode}
  2485. % The auxiliary functions here, for the |presort| function, are analogous to
  2486. % the ones for |calc.label|; the same comments apply, except that the
  2487. % |organization| field takes precedence here over the |key| field.  For sorting
  2488. % purposes, we still remove a leading ``The '' from the |organization| field.
  2489. %    \begin{macrocode}
  2490. FUNCTION {author.sort}
  2491. { author empty$
  2492.     { key empty$
  2493.         { "to sort, need author or key in " cite$ * warning$
  2494.           ""
  2495.         }
  2496.         { key sortify }
  2497.       if$
  2498.     }
  2499.     { author sort.format.names }
  2500.   if$
  2501. FUNCTION {author.editor.sort}
  2502. { author empty$
  2503.     { editor empty$
  2504.         { key empty$
  2505.             { "to sort, need author, editor, or key in " cite$ * warning$
  2506.               ""
  2507.             }
  2508.             { key sortify }
  2509.           if$
  2510.         }
  2511.         { editor sort.format.names }
  2512.       if$
  2513.     }
  2514.     { author sort.format.names }
  2515.   if$
  2516. FUNCTION {author.organization.sort}
  2517. { author empty$
  2518.     { organization empty$
  2519.         { key empty$
  2520.             { "to sort, need author, organization, or key in " cite$ * warning$
  2521.               ""
  2522.             }
  2523.             { key sortify }
  2524.           if$
  2525.         }
  2526.         { "The " #4 organization chop.word sortify }
  2527.       if$
  2528.     }
  2529.     { author sort.format.names }
  2530.   if$
  2531. FUNCTION {editor.organization.sort}
  2532. { editor empty$
  2533.     { organization empty$
  2534.         { key empty$
  2535.             { "to sort, need editor, organization, or key in " cite$ * warning$
  2536.               ""
  2537.             }
  2538.             { key sortify }
  2539.           if$
  2540.         }
  2541.         { "The " #4 organization chop.word sortify }
  2542.       if$
  2543.     }
  2544.     { editor sort.format.names }
  2545.   if$
  2546. %    \end{macrocode}
  2547. % There is a limit, |entry.max$|, on the length of an entry string variable
  2548. % (which is what its |sort.key$| is), so we take at most that many characters
  2549. % of the constructed key, and hope there aren't many references that match
  2550. % to that many characters!
  2551. %    \begin{macrocode}
  2552. FUNCTION {presort}
  2553. %<*lab-alph>
  2554. { calc.label
  2555.   sort.label
  2556.   "    "
  2557.   type$ "book" =
  2558. %</lab-alph>
  2559. %<!lab-alph>{ type$ "book" =
  2560.   type$ "inbook" =
  2561.     'author.editor.sort
  2562.     { type$ "proceedings" =
  2563.         'editor.organization.sort
  2564.         { type$ "manual" =
  2565.             'author.organization.sort
  2566.             'author.sort
  2567.           if$
  2568.         }
  2569.       if$
  2570.     }
  2571.   if$
  2572. %<lab-alph> *
  2573.   "    "
  2574.   year field.or.null sortify
  2575.   "    "
  2576.   title field.or.null
  2577.   sort.format.title
  2578.   #1 entry.max$ substring$
  2579.   'sort.key$ :=
  2580. ITERATE {presort}
  2581. %    \end{macrocode}
  2582. % And now we can sort.
  2583. %    \begin{macrocode}
  2584. %</sorted>
  2585. %    \end{macrocode}
  2586. % \subsection{Sorted Alphabetic Labels}
  2587. % This long comment applies only to alphabetic labels, when sorted.
  2588. % Now comes the final computation for alphabetic labels, putting in the `a's
  2589. % and `b's and so forth if required.  This involves two passes: a forward
  2590. % pass to put in the `b's, `c's and so on, and a backwards pass
  2591. % to put in the `a's (we don't want to put in `a's unless we know there
  2592. % are `b's).
  2593. % We have to keep track of the longest (in |width$| terms) label, for use
  2594. % by the |thebibliography| environment.
  2595. % \begin{quote}
  2596. % VAR: |longest.label|, |last.sort.label|, |next.extra|:\quad string \\
  2597. % \quad |longest.label.width|, |last.extra.num|: \quad integer
  2598. % \end{quote}
  2599. % \begin{verbatim}
  2600. % initialize.longest.label ==
  2601. %  BEGIN
  2602. %       longest.label := ""
  2603. %       last.sort.label := int.to.chr$(0)
  2604. %       next.extra := ""
  2605. %       longest.label.width := 0
  2606. %       last.extra.num := 0
  2607. %  END
  2608. % forward.pass ==
  2609. %  BEGIN
  2610. %       if last.sort.label = sort.label then
  2611. %           last.extra.num := last.extra.num + 1
  2612. %           extra.label := int.to.chr$(last.extra.num)
  2613. %       else
  2614. %           last.extra.num := chr.to.int$("a")
  2615. %           extra.label := ""
  2616. %           last.sort.label := sort.label
  2617. %       fi
  2618. %  END
  2619. % reverse.pass ==
  2620. %  BEGIN
  2621. %       if next.extra = "b" then
  2622. %           extra.label := "a"
  2623. %       fi
  2624. %       label := label * extra.label
  2625. %       if width$(label) > longest.label.width then
  2626. %           longest.label := label
  2627. %           longest.label.width := width$(label)
  2628. %       fi
  2629. %       next.extra := extra.label
  2630. %  END
  2631. % \end{verbatim}
  2632. %    \begin{macrocode}
  2633. %<*lab-alph>
  2634. %<*sorted>
  2635. STRINGS { longest.label last.sort.label next.extra }
  2636. INTEGERS { longest.label.width last.extra.num }
  2637. FUNCTION {initialize.longest.label}
  2638. { "" 'longest.label :=
  2639.   #0 int.to.chr$ 'last.sort.label :=
  2640.   "" 'next.extra :=
  2641.   #0 'longest.label.width :=
  2642.   #0 'last.extra.num :=
  2643. FUNCTION {forward.pass}
  2644. { last.sort.label sort.label =
  2645.     { last.extra.num #1 + 'last.extra.num :=
  2646.       last.extra.num int.to.chr$ 'extra.label :=
  2647.     }
  2648.     { "a" chr.to.int$ 'last.extra.num :=
  2649.       "" 'extra.label :=
  2650.       sort.label 'last.sort.label :=
  2651.     }
  2652.   if$
  2653. FUNCTION {reverse.pass}
  2654. { next.extra "b" =
  2655.     { "a" 'extra.label := }
  2656.     'skip$
  2657.   if$
  2658.   label extra.label * 'label :=
  2659.   label width$ longest.label.width >
  2660.     { label 'longest.label :=
  2661.       label width$ 'longest.label.width :=
  2662.     }
  2663.     'skip$
  2664.   if$
  2665.   extra.label 'next.extra :=
  2666. EXECUTE {initialize.longest.label}
  2667. ITERATE {forward.pass}
  2668. REVERSE {reverse.pass}
  2669. %</sorted>
  2670. %<*!sorted>
  2671. %    \end{macrocode}
  2672. % It still doesn't seem like a good idea to use an order-of-citation
  2673. % reference list when using alphabetic labels, but when this happens we
  2674. % must compute the longest label
  2675. %    \begin{macrocode}
  2676. STRINGS { longest.label }
  2677. INTEGERS { longest.label.width }
  2678. FUNCTION {initialize.longest.label}
  2679. { "" 'longest.label :=
  2680.   #0 'longest.label.width :=
  2681. FUNCTION {longest.label.pass}
  2682. { label width$ longest.label.width >
  2683.     { label 'longest.label :=
  2684.       label width$ 'longest.label.width :=
  2685.     }
  2686.     'skip$
  2687.   if$
  2688. EXECUTE {initialize.longest.label}
  2689. ITERATE {longest.label.pass}
  2690. %</!sorted>
  2691. %</lab-alph>
  2692. %<*!lab-alph>
  2693. %    \end{macrocode}
  2694. % \subsection{Numeric Labels}
  2695. % Now comes the computation for numeric labels.
  2696. % We use either the sorted order or original order.
  2697. % We still have to keep track of the longest (in |width$| terms) label, for use
  2698. % by the |thebibliography| environment.
  2699. %    \begin{macrocode}
  2700. STRINGS { longest.label }
  2701. INTEGERS { number.label longest.label.width }
  2702. FUNCTION {initialize.longest.label}
  2703. { "" 'longest.label :=
  2704.   #1 'number.label :=
  2705.   #0 'longest.label.width :=
  2706. FUNCTION {longest.label.pass}
  2707. { number.label int.to.str$ 'label :=
  2708.   number.label #1 + 'number.label :=
  2709.   label width$ longest.label.width >
  2710.     { label 'longest.label :=
  2711.       label width$ 'longest.label.width :=
  2712.     }
  2713.     'skip$
  2714.   if$
  2715. EXECUTE {initialize.longest.label}
  2716. ITERATE {longest.label.pass}
  2717. %</!lab-alph>
  2718. %    \end{macrocode}
  2719. % \subsection{Writing the {\tt.bbl} File}
  2720. % Now we're ready to start writing the {\tt.bbl} file.
  2721. % We begin, if necessary, with a \LaTeX{} macro for unnamed names in an 
  2722. % alphabetic
  2723. % label; next comes stuff from the |preamble| command in the database files.
  2724. % Then we give an incantation containing the command
  2725. % \begin{quote}
  2726. % |    \begin{thebibliography}{...}|
  2727. % \end{quote}
  2728. % where the |...| is the longest label.
  2729. % We also call |init.state.consts|, for use by the output routines.
  2730. %    \begin{macrocode}
  2731. FUNCTION {begin.bib}
  2732. %<*lab-alph>
  2733. { et.al.char.used
  2734.     { "\newcommand{\etalchar}[1]{$^{#1}$}" write$ newline$ }
  2735.     'skip$
  2736.   if$
  2737.   preamble$ empty$
  2738. %</lab-alph>
  2739. %<!lab-alph>{ preamble$ empty$
  2740.     'skip$
  2741.     { preamble$ write$ newline$ }
  2742.   if$
  2743.   "\begin{thebibliography}{"  longest.label  * "}" * write$ newline$
  2744. EXECUTE {begin.bib}
  2745. EXECUTE {init.state.consts}
  2746. %    \end{macrocode}
  2747. % Now we produce the output for all the entries.
  2748. %    \begin{macrocode}
  2749. ITERATE {call.type$}
  2750. %    \end{macrocode}
  2751. % Finally, we finish up by writing the `|\end{thebibliography}|' command.
  2752. %    \begin{macrocode}
  2753. FUNCTION {end.bib}
  2754. { newline$
  2755.   "\end{thebibliography}" write$ newline$
  2756. EXECUTE {end.bib}
  2757. %</!options>
  2758. %    \end{macrocode}
  2759. % \Finale
  2760.